Existe uma maneira de imprimir a última linha de um arquivo e depois a primeira linha de um arquivo somente no awk?

7

Eu pesquisei, mas falhei com uma resposta. Eu quero imprimir a última linha (ou registro) em um arquivo; em seguida, imprima a primeira linha usando apenas awk. Eu sei imprimir a primeira linha:

NR == 1{print}

e última linha

END{print}

No entanto, como posso mudar as posições? É mesmo possível? Eu só recebo erros quando tento fazer isso. Existe uma maneira de integrar o

NR == 1{print}

comando no comando END? Mais uma vez, eu só quero fazer isso no awk. Obrigado!

    
por Nack 04.02.2017 / 05:09

2 respostas

17

Salve a primeira linha em uma variável

awk 'NR==1 {first = $0} END {print; print first}' file

dado file como

line 1
line 2
line 3
line 4
line 5

então

$ awk 'NR==1 {first = $0} END {print; print first}' file
line 5
line 1
    
por 04.02.2017 / 05:17
1

O AWK possui a função getline() , que permite avançar para a próxima linha. O status de saída desta linha é zero quando não podemos avançar mais, ou seja, chegamos ao fim do arquivo. Assim, a ideia básica que podemos usar é armazenar a primeira linha na variável, acompanhar a linha atual e continuar tentando avançar com getline . Se não pudermos - imprima as variáveis na ordem desejada.

$ cat input.txt
first line
middle line
last line

$ awk 'NR==1{first=$0};{while (getline line); printf "%s\n%s\n",line,first}' input.txt                                   
last line
first line
    
por 04.02.2017 / 05:17

Tags