ccl - cut and change lines

Publicado por Denis Doria 25/07/2008

[ Hits: 5.353 ]

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:

thuck@thuck:~/programacao/scripts$ echo "denis doria"|awk '{print $2,$1}'
doria denis

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

thuck@thuck:~/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

Hashing com Árvore Binária

Serialização em Python usando pickle

Manipulação de arquivos CSV - OO

Pyconv - Conversor de codificação de caracteres

Miojo Notepad 0.3


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts