使用awk将最后一行移动到第一位



如何使用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]
    }
}

最新更新