grep última palavra de uma determinada linha .csv

0

Eu tenho um arquivo de texto como este:

first, second
hello, bye
one, two
good, bad
day, night

Eu gostaria de ter um script que, baseado em uma variável, recupera a última palavra de uma determinada linha usando grep ou awk .

por exemplo: se num for 3 , a saída deve ser two .

Não é necessário pedir o valor num.

    
por Cesar Alejandro Villegas Yepez 14.03.2017 / 16:27

2 respostas

5

Usando awk :

$ awk -v num="$num" 'NR == num { print $NF }' data.in

Teste:

$ num=3
$ awk -v num="$num" 'NR == num { print $NF }' data.in
two

O script awk lê o registro do arquivo de entrada por registro (um registro é, por padrão, uma linha). Depois de atingir o registro correspondente à variável num , ele imprime o último campo desse registro (um campo é, por padrão, uma coluna separada por espaço em branco).

A variável num dentro do script awk é uma variável awk que inicializamos com o valor da variável do shell num com -v num="$num" na linha de comando.

NR é o número do registro atual e NF é o número de campos nesse registro. $NF são os dados do último campo.

Se o seu arquivo estiver estritamente separado por vírgula, adicione -F ',' à linha de comando:

$ awk -v num="$num" -F ',' 'NR == num { print $NF }' data.in

Com grep você não pode selecionar uma linha específica, mas junto com sed você pode filtrar a linha desejada e depois obter o último bit após a última vírgula:

$ sed -n "${num}p" data.in | grep -o '[^,]*$'

O sed bit obterá a linha especificada enquanto o grep bit extrairá tudo após a última vírgula nessa linha.

Você também pode fazer isso com sed :

$ sed -n "${num}s/^.*,\(.*\)$//p" data.in

Aqui, a substituição é aplicada somente à linha cujo número é $num e substitui toda a linha pelo conteúdo da linha após a última vírgula e gera o resultado. Todas as outras saídas são inibidas com a chave de linha de comando -n .

Como alternativa, use uma substituição em sed para simplesmente excluir tudo na linha até a última vírgula:

$ sed -n "${num}s/^.*,//p" data.in
    
por 14.03.2017 / 16:35
1

No awk, NR é o número da linha, NF é o número de colunas, portanto, $ NF é a última coluna. FS é o separador de registro de entrada, ', ' para CSV sem vírgulas citadas deve ser suficiente.

awk -v FS=', ' 'NR==3{print $NF}'
    
por 14.03.2017 / 16:37