ccl - cut and change lines
Publicado por Denis Doria 25/07/2008
[ Hits: 5.574 ]
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
Descobrir HOME do usuario e criar arquivo de configuração
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)
Instalação não está resolvendo as dependencias (2)
Captação de áudio no zorin linux começa a diminuir com o tempo (5)
Alternativas ao Multilogin para gerenciamento de múltiplas contas/prof... (0)









