我有这样的文件
1 2 "45554323" p b
2 2 "34534567" f a
3 3 "76546787" u b
2 4 "56765435" f a
* a
0 b
我想删除a
,b
END{}
部分中的最后两条记录
结果:
1 2 "45554323" p b
2 2 "34534567" f a
3 3 "76546787" u b
2 4 "56765435" f a
*
0
如何获取最后 n 行并使用 awk 更改其上的字段?
以下是使用任何awk的一种方法:
awk -v count=$(wc -l <file.txt) 'NR > count - 2 { $2 = "" }1' file.txt
结果:
1 2 "45554323" p b
2 2 "34534567" f a
3 3 "76546787" u b
2 4 "56765435" f a
*
0
或者,要对除输入文件的最后 2 行之外的所有记录执行awk
操作作为 shell 脚本,请尝试 ./script.sh file.txt
。script.sh
内容:
command=$(awk -v count=$(wc -l <"$1") 'NR <= count - 2 { $2 = "" }1' "$1"
echo -e "$command"
结果:
1 "45554323" p b
2 "34534567" f a
3 "76546787" u b
2 "56765435" f a
* a
0 b
如果您知道 n
的值 - 要删除行/列上的最后一项的行号(此处为 4
),这将起作用:
awk '{if (NR>4) NF=NF-1}1' data.txt
将给予:
1 2 "45554323" p b
2 2 "34534567" f a
3 3 "76546787" u b
2 4 "56765435" f a
*
0
NF = NF -1
使 awk 认为行上的字段比实际少一个字段,这就是一旦满足该条件它就不会显示行上的最后一列/项目的原因。 NR
是指正在读取的文件中的当前行号。
awk 无法知道文件中的行数,除非它遍历一次,或者被赋予了该信息(例如,wc -l
)。 另一种方法是将最后 n
行保存在缓冲区中(类似于滑动窗口/磁带延迟类型的类比,您总是在后面打印n
行),然后在END
块中处理最后的n
行。
这并不能完全回答您的问题,但它会产生您需要的输出:
$ gawk '{if (NF < 3) print $1; else print}' input.txt
1 2 "45554323" p b
2 2 "34534567" f a
3 3 "76546787" u b
2 4 "56765435" f a
*
0
$ cat file
1 2 "45554323" p b
2 2 "34534567" f a
3 3 "76546787" u b
2 4 "56765435" f a
* a
0 b
$ awk 'BEGIN{ARGV[ARGC++]=ARGV[ARGC-1]} NR==FNR{nr++; next} FNR>(nr-2) {NF--} 1' file
1 2 "45554323" p b
2 2 "34534567" f a
3 3 "76546787" u b
2 4 "56765435" f a
*
0
或者,如果您不介意手动指定文件名两次:
awk 'NR==FNR{nr++; next} FNR>(nr-2) {NF--} 1' file file