awk将文件最后一行复制并移动到上一行

时间:2017-09-11 17:29:47

标签: awk

在下面的awk中,我试图仅将最后一行移到上面的那一行。下面的问题是,由于我的输入文件不同(不总是如下所示的4行),我不能每次都使用i=3,似乎无法修复它。谢谢 :)。

文件

this is line 1
this is line 2
this is line 3
this is line 4

所需的输出

this is line 1
this is line 2
this is line 4
this is line 3

awk (似乎最后一行被移动,但是i = 2)

awk '
    {lines[NR]=$0}
    END{
        print lines[1], lines[NR];
        for (i=3; i<NR; i++) {print lines[i]}
    }
' OFS=$'\n' file

this is line 1
this is line 2
this is line 4
this is line 3

4 个答案:

答案 0 :(得分:3)

$ seq 4 | awk 'NR>2{print p2} {p2=p1; p1=$0} END{print p1 ORS p2}'
1
2
4
3

$ seq 7 | awk 'NR>2{print p2} {p2=p1; p1=$0} END{print p1 ORS p2}'
1
2
3
4
5
7
6

答案 1 :(得分:1)

你几乎拥有它。你只需要改变顺序。

awk '
    {lines[NR]=$0}
    END{
        for (i=1; i<NR-1; i++) {print lines[i]}
        print lines[NR];
        print lines[NR-1];
    }
' OFS=$'\n' file

答案 2 :(得分:1)

尝试关注awk一次:

awk '{a[FNR]=$0} END{for(i=1;i<=FNR-2;i++){print a[i]};print a[FNR] ORS a[FNR-1]}'  Input_file

说明:创建一个名为a的数组,其索引为FNR(当前行号),并将其值保持为当前行的值。现在在awk的END部分,从i = 1开始for循环到i&lt; = FNR-2为什么直到FNR-2,因为你需要在这里交换最后2行。打印完所有行后,只需打印[FNR](最后一行),然后用ORS打印[FNR-1](打印新行)。

解决方案第二:通过计算Input_file中的行数并将它们放入awk变量。

awk -v lines=$(wc -l < Input_file) 'FNR==(lines-1){val=$0;next} FNR==lines{print $0 ORS val;next} 1'  Input_file

答案 3 :(得分:1)

我要反转文件,交换第一个两行,然后重新反转文件

tac file | awk 'NR==1 {getline line2; print line2} 1' | tac