Pule as 6 primeiras linhas / linhas em um arquivo de texto com awk

39

Como posso pular as 6 primeiras linhas / linhas em um arquivo de texto (input.txt) e processar o restante com o awk? O formato do meu script awk (program.awk) é:

BEGIN {
} 

{ 
process here
} 

END {

}

Meu arquivo de texto é assim:

0
3
5
0.1 4.3
2.0 1.5
1.5 3.0
0.3 3.3
1.5 2.1
.
.
.

Quero processar o arquivo a partir de:

0.3 3.3
1.5 2.1
.
.
.
amatek
fonte

Respostas:

59

Use um dos dois padrões:

NR>6 { this_code_is_active }

ou isto:

NR<=6 { next }
{ this_code_is_active }

Use FNR em vez de NR se você tiver muitos arquivos como argumentos para ativar e desejar pular 6 linhas em cada arquivo.

Janis
fonte
29

Experimentar:

awk 'FNR > 6 { #process here }' file
cuonglm
fonte
4
Boa! Mas você não explicou por que isso é melhor - pois vários arquivos FNRsão o número da linha em cada arquivo, enquanto NRé o número em toda a entrada (não é um problema durante a tubulação).
Tomasz Gandor
3

Você também pode pular um número arbitrário de linhas no início ou no final do arquivo usando headou tailprogramas.

Para sua pergunta concreta,

tail input.txt -n+7 | program.awk

fará, desde que seu program.awkarquivo seja executável. Caso contrário, você pode usar

tail input.txt -n+7 | awk -f program.awk

Dessa forma, você poupará uma comparação para cada linha e não precisará alterar a lógica do seu código AWK.

tail começará a transmitir texto começando na sétima linha, pulando as seis primeiras linhas.

Isso não será um grande negócio em desempenho, especialmente se o processo de texto for simples, graças ao cache. No entanto, arquivos longos e uso repetido no ambiente de nuvem podem economizar algum custo.

Dr. Windows
fonte
Correto, mas como regra geral, deve-se evitar a tubulação quando você pode fazer isso facilmente com apenas uma ferramenta. Pense em um enorme arquivo de texto transmitindo os dois comandos apenas para remover algumas linhas.
Philippos