这是做什么的?
( 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
,$1
will befoo
和$2
will be 这样的行bar
。因此,这将打印变量的值prev
(请参见下一点),后跟一个空格 (" "
),然后是当前行的第一个字段。prev = $1;
:将此行的第一个字段保存在变量中prev
。因此,当我们处理下一行时,prev
将具有上一行的第一个字段。
要查看它的作用,您可以在测试输入上尝试。例如,使用seq 5
which 打印从 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
。