ccl - cut and change lines
Publicado por Denis Doria 25/07/2008
[ Hits: 5.685 ]
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)
Organizando suas músicas com Python
pySuporte - Script para controle de chamados armazena num txt.
Manipulação de arquivos CSV - OO
Nenhum comentário foi encontrado.
Papagaiando o XFCE com temas e recursos
WhatsApp com Chamadas no Linux via Waydroid
XFCE - quase um Gnome ou Plasma mas muito mais leve
LXQT - funcional para máquinas pererecas e usuários menos exigentes
Instalando o COSMIC DE no Gentoo (systemd)
Centralizar Logo com Transparência via ImageMagick
Removendo entradas de boot UEFI "fantasmas" via terminal
Atualizações de Segurança Automáticas no Debian
Como cortar as partes de um vídeo com passagens de áudio em branco
Midia de instalação LM-21.3 não inicializa [RESOLVIDO] (15)
What are the biggest challenges banks face with compliance training? (0)
Reunir material [RESOLVIDO] (4)
Uma pergunta bem simples mas não achei resposta (ainda) [RESOLVIDO] (4)









