Como imprimir a última palavra que contém separador de campo

0

Como imprimir o último campo ( word3,a,b,c,d,e ), que contém o separador de campos , ?

  • em cada linha, temos apenas 3 palavras / strings como a seguinte estrutura

    tipo, parâmetro, valor

mas o valor pode incluir o próprio separador de campo sem escape. Exemplo da linha:

echo word1,word2,word3,a,b,c,d,e | awk -F "," '{print $3}'

sua impressão:

word3

resultados esperados:

word3,a,b,c,d,e

outro exemplo

echo 32637,921763.373,str84,str42,struj,str56,str65 | awk -F "," '{print $3}'

resultados esperados:

str84,str42,struj,str56,str65 
    
por yael 17.08.2017 / 09:57

5 respostas

2

Bem, o último campo em word1,word2,word3,a,b,c,d,e é e e o terceiro campo é word3 . Parece que você quer a parte da linha que começa com o terceiro campo. É mais fácil com cut :

$ echo word1,word2,word3,a,b,c,d,e | cut -d , -f 3-
word3,a,b,c,d,e

-f 3- é -f x-y para os campos x a y, mas com y omitido, portanto é de 3 rd para o último campo.

Observe que as linhas contêm pelo menos 3 campos. Ele daria linhas de saída vazias para linhas de entrada que contenham 2 campos e deixaria a linha intocada se não contivesse vírgula (você pode adicionar uma opção -s para pular as linhas não delimitadas):

$ printf '%s\n' a a,b a,b,c a,b,c,d | cut -d , -f 3-
a

c
c,d
$ printf '%s\n' a a,b a,b,c a,b,c,d | cut -sd , -f 3-

c
c,d

Com awk , você poderia fazer:

$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,[^,]*,/, "")'
c
c,d

(a variante awk 'sub(/^([^,]*,){2}/, "")' , embora POSIX, é menos portável, pois ainda existem algumas implementações awk que não suportam o operador {x,y} regexp)

Para excluir os dois primeiros campos (e apenas imprimir as linhas onde eles foram removidos), embora isso esteja usando awk como sed glorificado, como é o mesmo que sed -n 's/^[^,]*,[^,]*,//p' .

Ou:

$ printf '%s\n' a a,b a,b,c a,b,c,d | awk 'sub(/^[^,]*,?[^,]*,?/, "")'


c
c,d

para imprimir uma linha vazia para linhas com menos de 3 campos.

    
por 17.08.2017 / 10:16
2

A maneira awk seria:

awk -F "," '{for(i=3;i<NF;i++)printf("%s,", $i);print $NF}'

Mas parece um trabalho para cut :

cut -d , -f 3-
    
por 17.08.2017 / 10:18
1

Com perl , fazendo uso de seu recurso de divisão de matriz (evitando a necessidade de um loop for como em awk ):

$ echo word1,word2,word3,a,b,c,d,e | perl -F, -lane 'print join(",",@F[2..$#F])'
word3,a,b,c,d,e

Explicação das opções de linha de comando perl usadas (consulte man perlrun para obter mais detalhes):

  • -F, definir o separador de campo para o preenchimento automático para ,
  • -l ativa o processamento automático de finalização de linha (isto é, tira automaticamente as linhas novas do final de cada linha de entrada e as adiciona a cada linha de saída print -ed).
  • -a ativar o modo de preenchimento automático - cada linha de entrada é automaticamente dividida em uma matriz @F .
  • -n lê e processa cada linha de stdin e / ou qualquer argumento de nome de arquivo (essencialmente, um loop while(<>) ao redor do script inteiro)
  • -e executa o próximo argumento (a string citada) como um script perl.

Observação: as matrizes perl são baseadas em zero, não em uma, de modo que o terceiro campo é o elemento da matriz 2, não 3 (ou seja, @F[2] , não @F[3] ) .

$#F é o número do índice do elemento final da matriz @F , portanto @F[2..$#F] significa "todos os elementos da matriz @F do terceiro para o último".

BTW, há outra opção -p , que é muito semelhante a -n , exceto que, no final de cada passagem pelo loop while(<>) , ela também imprime a linha de entrada. Se a linha de entrada foi modificada por qualquer declaração anterior, a linha é impressa como modificada.

Um dos usos para isso é que ele permite que você escreva muito sed -like scripts em perl (mas com todos os recursos e açúcar sintático de perl além de sed ). por exemplo. perl -pe 's/foo/bar/g' e sed -e 's/foo/bar/g' terão saída idêntica dada a mesma entrada.

Da mesma forma, -n combinado com -a facilita escrever muito scripts awk . De fato, perl -lane é praticamente a maneira padrão de escrever um co-de-% -como-liner com awk .

Um dos pontos strongs de perl é que ele combina os recursos de perl e sed (e de awk ) e muito mais, incluindo o acesso a uma enorme biblioteca de módulos chamada " Rede abrangente de arquivos Perl "ou CPAN

    
por 17.08.2017 / 15:11
0

Com isso você está pronto

echo 32637,921763.373,str84,str42,struj,str56,str65 | awk -F "," '{ for(i = 3; i < NF+1; i++) printf "%s%s",$i,(i!=NF?",":"");}'

mas de qualquer forma, você precisa ler documentos do awk.

    
por 17.08.2017 / 10:22
0

Usando sed :

sed 's/^\([^,]*,\)\{0,2\}//' <<<"$line"
    
por 17.08.2017 / 10:29