我有一个包含这些数据的文件:
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
我有一个包含这些数据的文件:
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
无需使用 awk,只需拖尾数据:
tail -n 10 input.txt > example.txt
如果您真的想使用 awk,则必须跟踪最后 10 行 ( $0
) 并将它们打印到END
. 虽然这将是矫枉过正。
这是该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
GNU sed的代码:
获取最后 10 行
sed ':a $q;N;11,$D;ba' file
获取除最后 10 行以外的所有内容
sed ':a $d;N;2,10ba;P;D' file