如何使用awk将最后一行移动到第一位。提前谢谢。
输入
a1 a2 a3 a4
1 2 3 4
0 0 0 0
2 3 3 3
输出
a1 a2 a3 a4
2 3 3 3
1 2 3 4
0 0 0 0
纯awk解决方案:
awk '{a[NR]=$0}END{for(i=1;i<NR;++i){if(i==2)print a[NR];print a[i]}}' file
a1 a2 a3 a4
2 3 3 3
1 2 3 4
0 0 0 0
使用记录编号作为关键字,将所有行保存到数组a
中。处理完文件后,循环遍历数组,在适当的位置插入最后一条记录a[NR]
。
在awk的某些版本中,$0
仍然包含END
块中文件的最后一行,因此您可以使用它来代替a[NR]
,但这种方式更广泛地兼容。感谢Ed Morton指出这一点。
使用awk的一种方法是处理一次文件,并将整个文件内容存储在内存中,最后按预期顺序再次输出。另外两个答案说明了它是如何运作的。
另一种方法是不保存内容,而是遍历文件两次。
awk 'NR==FNR{e=$0;c=NR;next}FNR==2{print e}FNR!=c' file file
首先我们记住最后一行内容和最后一行编号。第二次,我们输出文本。
测试:
kent$ cat f
title
1
2
3
4
5
6
7
kent$ awk 'NR==FNR{e=$0;c=NR;next}FNR==2{print e}FNR!=c' f f
title
7
1
2
3
4
5
6
$ awk '{a[NR]=$0} END{print a[1] ORS a[NR]; for (i=2;i<NR;i++) print a[i]}' file
a1 a2 a3 a4
2 3 3 3
1 2 3 4
0 0 0 0
应该能正常工作
tac file | awk 'x{print x}NR==1{y=$0;next}{x=$0}END{print y"n"x}' | tac
输出
a1 a2 a3 a4
2 3 3 3
1 2 3 4
0 0 0 0
我第一次完全弄错了这个问题,需要更改它(在它已经被接受之后)。
我最后得出了以下结论,这与TomFenech的答案基本相同。请接受他的回答,因为他很久以前就发过了。。
# Append all lines to buffer
{
a[NR]=$0
}
# Rearrange it at the end
END {
for(i=1;i<NR;i++) {
if(i==2) {
print a[NR]
}
print a[i]
}
}