在下面的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
答案 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