我有这样的文件
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
如何使用awk获取最后一行并更改它们的字段?
答案 0 :(得分:3)
这是使用GNU 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
或者对除了输入文件的最后两行之外的所有记录进行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
答案 1 :(得分:2)
如果您知道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
行),然后处理最后的n
行。 1}} END
块中的行。
答案 2 :(得分:1)
这并不能完全回答您的问题,但会产生您需要的输出:
$ 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
答案 3 :(得分:1)
$ 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