2

我有这样的文件

1      2      "45554323"      p      b  
2      2      "34534567"      f      a  
3      3      "76546787"      u      b  
2      4      "56765435"      f      a  
*      a  
0      b  

我想从部分的最后两条记录a中删除bEND{}

结果:

1      2      "45554323"      p      b  
2      2      "34534567"      f      a  
3      3      "76546787"      u      b  
2      4      "56765435"      f      a  
*        
0        

如何使用 awk 获取最后一行并更改其上的字段?

4

4 回答 4

4

这是使用任何 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除输入文件的最后 2 行以外的所有记录作为 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  
于 2012-10-14T14:53:23.187 回答
3

如果您知道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一行END

于 2012-10-14T13:45:02.210 回答
2

这并不能完全回答您的问题,但会产生您需要的输出:

$ 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
于 2012-10-14T13:42:11.577 回答
2
$ 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
于 2012-10-14T14:28:35.027 回答