0

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

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
4

3 回答 3

6

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

tail -n 10 input.txt > example.txt

如果您真的想使用 awk,则必须跟踪最后 10 行 ( $0) 并将它们打印到END. 虽然这将是矫枉过正。

于 2013-07-20T11:41:21.387 回答
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
于 2013-07-20T11:48:39.473 回答
0

GNU 的代码:

  • 获取最后 10 行

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

    sed ':a $d;N;2,10ba;P;D' file
    
于 2013-07-20T17:46:33.363 回答