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

时间:2015-04-08 13:19:51

标签: 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

5 个答案:

答案 0 :(得分:3)

一个纯粹的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指出这一点。

答案 1 :(得分:3)

使用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

答案 2 :(得分:2)

$ 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

答案 3 :(得分:1)

我首先得到完全错误的问题并需要更改它(在它已被接受之后)。

我最终得到了以下内容,这与TomFenech's回答基本相同。请接受他的答复,因为他很久以前发布了这个答案。

# 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]
    }
}

答案 4 :(得分:1)

应该可以工作

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