Como cortar (selecionar) um campo da linha de texto contando a partir do final?


32

Eu sei como selecionar um campo de uma linha usando o comando recortar. Por exemplo, dados os seguintes dados:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

Este comando:

cut -d, -f2 # returns the second field of the input line

Devoluções:

b
g
l

Minha pergunta: como posso selecionar o segundo campo contando a partir do final? No exemplo anterior, o resultado seria:

d
i
n

Respostas:


52

Inverta a entrada antes e depois cutcom rev:

<infile rev | cut -d, -f2 | rev

Saída:

d
i
n

1
Eu tenho muitos pequenos trechos na minha pasta bin. O rcut é exatamente para isso: #! / bin / bash rev | corte "$ @" | rev
John Allsup

2
Pena cutque não é possível obter índices de campo negativos (como Python).
Keith Devens

10

Tente fazer isso com o :

awk -F, '{print $(NF-1)}' file.txt

Ou usando :

perl -F, -lane 'print $F[-2]' file.txt

Ou usando (obrigado manatwork):

ruby -F, -lane 'print $F[-2]' file.txt

Ou usando bash(obrigado manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

Ou usando :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bashnão precisa de contagem de coluna fixa para isso: while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt.
manatwork

1
BTW, sua terceira solução também funciona se você mudar perlcom ruby.
manatwork

Obrigado, rubyadicionado, basheditado.
Gilles Quenot

1
Se o quarto campo pode começar com -ou (dependendo do ambiente, shell ou como o shell foi compilado), pode conter caracteres de barra invertida, echonão é uma opção. Por que você precisa se catcontentar file.txtcom nada antes de alimentá-lo para python!?. Você precisa em read -Avez de read -adentro ksh93e zsh. Subscritos negativos funcionam, zshmas apenas nas versões recentes de ksh93e bash. Em versões mais antigas, você pode usar${d: -2:1}
Stéphane Chazelas

2
@StephaneChazelas, acho que você quis dizer ${d[@]: -2:1}na sua última frase.
manatwork

0

Usando sed:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

Saída:

d
i
n

Explicação

  • ([^,]*,)* corresponde a qualquer número de caracteres que não sejam vírgulas, seguidos por vírgula, ou seja, qualquer número de colunas.
  • ([^,]*) corresponde a uma coluna.
  • (,[^,]*){1}corresponde a uma coluna no final, se você alterar o quantificador {1}para {2}corresponder à segunda coluna no final etc.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.