使用 awk 跳过文本文件中的前 6 行/行

ama*_*tek 63 awk gawk

如何跳过文本文件 (input.txt) 中的前 6 行/行并使用 awk 处理其余部分?我的 awk 脚本(program.awk)的格式是:

BEGIN {
} 

{ 
process here
} 

END {

}
Run Code Online (Sandbox Code Playgroud)

我的文本文件是这样的:

0
3
5
0.1 4.3
2.0 1.5
1.5 3.0
0.3 3.3
1.5 2.1
.
.
.
Run Code Online (Sandbox Code Playgroud)

我想从以下位置开始处理文件:

0.3 3.3
1.5 2.1
.
.
.
Run Code Online (Sandbox Code Playgroud)

Jan*_*nis 91

使用以下两种模式之一:

NR>6 { this_code_is_active }
Run Code Online (Sandbox Code Playgroud)

或这个:

NR<=6 { next }
{ this_code_is_active }
Run Code Online (Sandbox Code Playgroud)

如果您有许多文件作为 awk 的参数并且希望在每个文件中跳过 6 行,请使用 FNR 而不是 NR。


cuo*_*glm 48

尝试:

awk 'FNR > 6 { #process here }' file
Run Code Online (Sandbox Code Playgroud)

  • 好的!但是你没有解释为什么这更好 - 对于多个文件,`FNR` 是每个文件中的行号,而 `NR` 是整个输入中的数字(管道时不是问题)。 (11认同)

小智 8

您还可以使用headtail程序在文件的开头或结尾跳过任意数量的行。

对于你的具体问题,

tail input.txt -n+7 | program.awk
Run Code Online (Sandbox Code Playgroud)

会做,只要你的program.awk文件是可执行的。否则,您可以使用

tail input.txt -n+7 | awk -f program.awk
Run Code Online (Sandbox Code Playgroud)

这样,您将节省每一行的比较,并且不需要更改 AWK 代码的逻辑。

tail 将从第七行开始流式传输文本,跳过前六行。

这在性能上不会有太大影响,特别是如果文本处理由于缓存而变得简单。但是,对于长文件和在云环境中重复使用可能会节省一些成本。

  • 正确,但根据经验,当您可以单独使用一种工具轻松完成时,应避免使用管道。想象一个巨大的文本文件管道通过这两个命令只是为了删除几行。 (2认同)
  • 我不同意避免管道。做一件事并把它做好。抛开格言不谈,我首先做我凭记忆想到的事情。不过,脚本与 CLI 也是如此。CLI 上的小集,我会花费最少的精力。然后,脚本可能适用于大型数据集,或者可能希望减少未来维护的范围,因此可能会减少管道。 (2认同)