ccl - cut and change lines
Publicado por Denis Doria 25/07/2008
[ Hits: 5.425 ]
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
#!/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)
Serialização em Python usando pickle
Web Scraping para coletar dados dos pilotos da Fórmula 1
Nenhum comentário foi encontrado.
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Youtube e networkmeneger para de funcionar (5)
Minha rede tem um espaço invisível que não dá pra digitar o nome da re... (1)
Pedagogia no brasil não passa de alfabetização por m4sturbação mental ... (2)
compilação samba 4.22 rock linux 9.5 (3)
Erro de segmentação «Segmentation fault (core dumped)» ao retornar obj... (7)