如何从awk中的文件中获取10个最后的值

时间:2013-07-20 11:37:34

标签: awk

我有一个包含此数据的文件:

345
234
232
454
343
676
887
324
342
355
657
786
343
879
088
342
121
345
534
657
767

我需要剪切最后10个值并将其放在另一个文件中:

786
343
879
388
342
121
345
534
657
767

3 个答案:

答案 0 :(得分:6)

无需使用awk,只需拖尾数据:

tail -n 10 input.txt > example.txt

如果你真的想使用awk,你必须跟踪最后10行($0)并在END中打印它们。虽然这样会有点过分。

答案 1 :(得分:2)

这是tail命令的用途:

$ tail -10 file
786
343
879
088
342
121
345
534
657
767

要将输出存储在新文件中,请使用重定向运算符:

$ tail -10 file > new_file

但是如果你真的想用awk来做,那么强力方法是将每一行存储在一个数组中并打印文件末尾的最后10个元素:

$ awk '{a[NR]=$0}END{for(i=(NR-9);i<=NR;i++)print a[i]}' file
786
343
879
088
342
121
345
534
657
767

同样,要将输出存储在新文件中,请使用重定向运算符:

$ awk '{a[NR]=$0}END{for(i=(NR-9);i<=NR;i++)print a[i]}' file > new_file

之前的方法是一种非常低效的方法,因为我们必须创建一个与我们正在读取的文件大小相同的数组。更好的方法是使用模数运算符来创建一个大小为10的数组,其中包含最后10行读取:

$ awk '{a[NR%10]=$0}END{for(i=NR%10+1;j++<10;i=++i%10) print a[i]}' file 
786
343
879
088
342
121
345
534
657
767

这可以推广到最后n行,如此(即n = 3)

$ awk '{a[NR%n]=$0}END{for(i=NR%n+1;j++<n;i=++i%n) print a[i]}' n=3 file 
534
657
767

答案 2 :(得分:0)

GNU代码

  • 获取最后10行

    sed ':a $q;N;11,$D;ba' file
    
  • 获取除最后10行之外的所有行

    sed ':a $d;N;2,10ba;P;D' file