Corte nos caracteres e no campo

3

Eu tenho um registro como:

2011-05-29 17:51:34 => 'HS|CMGC|RN431|CI13950|CH7-4a37-afe2-acabfc9d262d|DA110529|TI175133|'

Eu quero que minha saída final seja algo como:

2011-05-29 17:51:34  CI13950

Eu posso pegar cada parte usando o corte assim:

$ cut -c 1-19
2011-05-29 17:51:34
$ cut -d  '|' -f 4
CI13950

Não consigo combinar os dois como:

$ cut -c 1-19 -d  '|' -f 4
cut: only one type of list may be specified

Alguma sugestão?

    
por Ricko M 02.06.2011 / 11:33

3 respostas

4

O Cut faz o seu trabalho uma vez. Você pode executar algo através de cut duas vezes para reduzi-lo ainda mais, mas parece que você precisa usar algo como awk , sed ou perl .

Exemplo de execução de vários cut s:

cut -f 2 | cut -c 3-6

Exemplo usando perl que funcionará na sua linha de dados:

perl -pne "s/=> '([^|]+\|){3}([^|]+)//g"

Aqui está uma versão sed do Fred nos comentários:

sed -re "s/=> ([^|]*\|){3}([^|]*).*//"
    
por 02.06.2011 / 11:40
4
awk '{split($NF,x,"|"); print $1, $2, x[4]}'
    
por 02.06.2011 / 15:28
0

Essa pergunta parece estranhamente familiar , embora eu veja que isso realmente aconteceu primeiro.

A abordagem mais simples e mais legível que vejo é usar o Awk da seguinte forma:

awk -F'|' '{print substr($0,1,19), $4}' text.txt

Isso é exatamente equivalente ao seu comando cut -c 1-19 -d '|' -f 4 , com exceção do código de trabalho. ;)

    
por 13.11.2016 / 10:56