获取 n 条最后记录并更改它们上的特定列

  • 本文关键字:最后 记录 获取 bash awk
  • 更新时间 :
  • 英文 :


我有这样的文件

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

我想删除ab 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.txtscript.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

相关内容

  • 没有找到相关文章

最新更新