我有一个包含此数据的文件:
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
答案 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代码sed:
获取最后10行
sed ':a $q;N;11,$D;ba' file
获取除最后10行之外的所有行
sed ':a $d;N;2,10ba;P;D' file