ccl - cut and change lines

Publicado por Denis Doria 25/07/2008

[ Hits: 4.910 ]

Download ccl.py




Fiz esse script quando estava começando a brincar com python. É uma implementação incompleta do cut, porém que possibilita a mudança das colunas na hora da impressão.

Basicamente simula o comportamente de um awk simples, mais ou menos assim:

[email protected]:~/programacao/scripts$ echo "denis doria"|awk '{print $2,$1}'
doria denis

No ccl você teria um arquivo com "denis doria" e faria:

[email protected]:~/programacao/scripts$ ./ccl.py -d' ' -c2,1 <arquivo>
doria denis

  



Esconder código-fonte

#!/usr/bin/python
# coding: ISO8859-1

import sys
from os import F_OK,R_OK,access
import getopt

def usage():

   print """ccl - cut and change lines\n
Uso: ccl <OPÇÕES> [ARQUIVO]

   -c, --campo=LISTA Seleciona campos para serem impressos, é possível alterar a ordem dos campos a serem impressos
   -d, --delimitador=DELIM Delimitador usado para separar os campos, se nenhum for especificado será usado um espaço como padrão
   -s, --saida=DELIM Delimitador de saída, se nenhum for especificado será usado o delimitador da entrada
   -h, --help Mostra essa ajuda

Se apenas o arquivo for passado o programa retirará as linhas em branco.
   
   A opção -c deve ser usada da seguinte forma -c1 ou -c1,2 ou -c2,1 etc."""

def parseOpt(argv):

   try:
      optlist, argv = getopt.gnu_getopt(argv,'d:c:s:h',['campo=','delimitador=','saida=','help'])
   
   except getopt.GetoptError, err:
      print err
      print str(err)
      sys.exit(2)

   return optlist, argv

def fileCheck(arquivo):

   #Verificação de existência do arquivo
   if access(arquivo,F_OK) == False:
      print >> sys.stderr , """Arquivo %s não existe!""" % (str(arquivo))
      return -2

   #Verificação da permissão de leitura do arquivo
   if access(arquivo,R_OK) == False:
      print >> sys.stderr , """Sem permissão de leitura."""
      sys.exit(1)
   
   return 0

def cut(arquivo):
   
   global lista_campos

   for i in arquivo.xreadlines(): 
   
      if lista_campos != -1: #Verifica se existem campos para imprimir
         linha = i.split(delimitador)
         linha_temp = ''

         for j in lista_campos:

            if j.isdigit() == False:
               print >> sys.stderr ,  """Apenas números são aceitos na opção -c."""
               sys.exit(1)
         
            campo = int(j)-1
            if campo < 0:
               print >> sys.stderr , """Não use valores menores ou iguais a 0."""
               sys.exit(1)

            #Verifica se a linha tem o campo e se a linha nao esta vazia, verifica se a linha nao esta em branco
            if campo < len(linha) and linha[campo] != '\n':

               linha_sem_quebra = str(linha[campo]).replace('\n','')

               if linha_sem_quebra.count(' ') != len(linha_sem_quebra):
                  linha_temp = linha_temp + linha_sem_quebra + delimitador_de_saida


         if linha_temp[:-1] != '':
            print linha_temp[:-1]

      elif i.count(' ') != len(str(i))-1:
         print i.replace('\n','')

   arquivo.close()

def optCheck(optlist):

   global delimitador
   global delimitador_de_saida
   global lista_campos
   global usar_delimitador_saida

   #Veirificacao das opcoes da linha de comando
   for o,a in optlist:  

      if o in ('-d','delimitador='): #verifica se a linha possui os argumentos coerentes
         if len(a) > 1:
            print >> sys.stderr ,  """O delimitador deve ser um único carácter"""
            print >> sys.stderr ,  """Tente ccl -h para uma lista das opções"""
            sys.exit(1)
         delimitador = a

      elif o in ('-c','campo='):
   
         lista_campos = a.split(',')
      
      elif o in ('-s','saida='):
              if len(a) > 1:
                   print >> sys.stderr ,  """O delimitador de saida deve ser um único carácter"""
                 print >> sys.stderr ,  """Tente ccl -h para uma lista das opções"""
            sys.exit(1)                                        
         delimitador_de_saida = a
         usar_delimitador_saida = True
   
      elif o in ('-h','--help'):
         usage()
         sys.exit(0)

   if usar_delimitador_saida == False:
      delimitador_de_saida = delimitador

if __name__ == '__main__':

   if len(sys.argv) < 2:
   
      print >> sys.stderr ,  """ccl: você deve passar ao menos um parâmetro\nFaça ccl -h para uma lista completa de opções."""
      sys.exit(1)

   delimitador = ' '
   delimitador_de_saida = ' '
   lista_campos = -1
   usar_delimitador_saida = False
   
   opt,argv = parseOpt(sys.argv[1:])   
   optCheck(opt)
   
   if argv == []:
      print >> sys.stderr ,  """ccl: você deve passar ao menos um arquivo\nFaça ccl -h para uma lista completa de opções."""
   
   for i in argv:
      check = fileCheck(i)

      if check == 0:
         cut(open(i,'r'))
   
      
   sys.exit(0)

Scripts recomendados

Checagem e remoção de arquivos

Dividir um grupo de arquivos em vários CDs Ou DVDs

Leitor de arquivo via linha de comandoEs

ccl - cut and change lines

Pyconv - Conversor de codificação de caracteres


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário