这个 awk 脚本有什么作用?

这个 awk 脚本有什么作用?

这是做什么的?

( awk '{ if (NR > 1) print prev " " $1; prev = $1; }' file)

答案1

那是一个awk脚本。awk 是一种编程语言它特别擅长处理字段分隔的数据。脚本本身非常简单:

  • if (NR > 1):NR是一个特殊awk变量,保存当前输入行的行号。所以这意味着“如果当前行号大于 1”,换句话说“对于除第一行之外的每一行”。
  • print prev " " $1;: 就像 一样NR$1也是一个特殊变量,保存该行的第一个字段。字段由空格定义(默认情况下,您可以使用 更改它-F),因此给定像foo bar, $1will befoo$2will be 这样的行bar。因此,这将打印变量的值prev(请参见下一点),后跟一个空格 ( " "),然后是当前行的第一个字段。
  • prev = $1;:将此行的第一个字段保存在变量中prev。因此,当我们处理下一行时,prev将具有上一行的第一个字段。

要查看它的作用,您可以在测试输入上尝试。例如,使用seq 5which 打印从 1 到 5 的数字:


$ seq 5
1
2
3
4
5
$ seq 5 | awk '{ if (NR > 1) print prev " " $1; prev = $1; }'
1 2
2 3
3 4
4 5

正如您在上面看到的,awk 脚本只是打印前一行的第一个字段,然后打印当前行的第一个字段。

答案2

假设输入文件是空格分隔的文件。这里给定的代码将读取整个文件并仅输出单行中第一列的值。

例如input.txt如下:-

AAA 4443
BBB 5595
CCC 4949
DDD 4434

awk脚本将输出以下内容

AAA BBB
BBB CCC
CCC DDD
DDD

当读取第一行时,它将存储第一行的第一列,即 AAA 到变量prev。当读取第二行时,它将打印 prev 的值,即AAA,然后打印第二行的第一列,因此它将变为AAA BBB。现在它将存储BBB在变量中prev。当读取第3行时,将打印BBB CCC。当读取第 4 行时,将打印CCC DDD

相关内容