Linux - 仅翻转最后一行,使用 awk
Linux - flip last bottom lines only, with awk
我们目前正在学习一些 manipulate/rearrange 文件文本的 awk 命令。
我们的原文是这样的..1998
Ford,mondeo,1998,5800
ford,fiesta,1994,4575
Chevy,impala,1998,1000
Plymouth,Fury,1992,2000
Dodge,charger,1989,5950
Ford,F150,1991,1450
它要求我们重新排列我已经做过的列(第一部分)..
但同时翻转底部的两行(第二部分),使其看起来像这样
1998 5800 Ford mondeo
1994 4575 ford fiesta
1998 1000 Chevy impala
1992 2000 Plymouth Fury
1991 1450 Ford F150
1989 5950 Dodge charger
同样,我已经处理好顺序和间距,但是如何切换底部的两行(或翻转它们)。顺便说一下,这只能用 awk 来完成。
以下代码切换文件的最后两行:
awk '{array[NR%3]=[=10=];
if(NR>2){print array[(NR+1)%3]}}
END{print array[NR%3];
print array[(NR-1)%3]}' test
为此,我们将最后三行存储在一个数组中。我们仅在读取下一行之后的行时才打印一行。最后,我们从数组中取出最后两行,反转顺序并打印它。
更详细的代码说明:
我们将当前行([=11=]
)的内容存储在一个数组中。由于我们只需要跟踪读取的最后三行,因此数组的索引可以限制为值 0、1 和 2。我们通过使用模运算符 (NR % 3
).
当到达第三行时,我们打印最后一行 (if(NR>2)...
)。这是保存,因为在这种情况下,数组中还有两行我们可以单独处理。
当到达文件末尾时 (END{...}
),我们以相反的顺序打印最后两行。
为什么我们使用 NR%3
(而不是 NR%2
)?如果我们的输入文件中只有两行,则打印必须发生在 END
块中而不是之前!
这将交换最后两行并为其他行省略打印
$ tac cars | awk 'NR==1{getline one}
NR==2{print; print one}
NR>2{print "omitted"}' | tac
omitted
omitted
omitted
Plymouth,Fury,1992,2000
Dodge,charger,1989,5950
您可以添加格式。同样可以没有 tac
和 END
块中的逻辑。
更新:仅限 awk 的解决方案:在内存中保留两行,完成后以相反的顺序打印它们
$ awk 'NR>2{print pp}
{pp=p;p=[=11=]}
END{print p;print pp}' car
Ford,mondeo,1998,5800
ford,fiesta,1994,4575
Chevy,impala,1998,1000
Plymouth,Fury,1992,2000
Ford,F150,1991,1450
Dodge,charger,1989,5950
我们目前正在学习一些 manipulate/rearrange 文件文本的 awk 命令。
我们的原文是这样的..1998
Ford,mondeo,1998,5800
ford,fiesta,1994,4575
Chevy,impala,1998,1000
Plymouth,Fury,1992,2000
Dodge,charger,1989,5950
Ford,F150,1991,1450
它要求我们重新排列我已经做过的列(第一部分).. 但同时翻转底部的两行(第二部分),使其看起来像这样
1998 5800 Ford mondeo
1994 4575 ford fiesta
1998 1000 Chevy impala
1992 2000 Plymouth Fury
1991 1450 Ford F150
1989 5950 Dodge charger
同样,我已经处理好顺序和间距,但是如何切换底部的两行(或翻转它们)。顺便说一下,这只能用 awk 来完成。
以下代码切换文件的最后两行:
awk '{array[NR%3]=[=10=];
if(NR>2){print array[(NR+1)%3]}}
END{print array[NR%3];
print array[(NR-1)%3]}' test
为此,我们将最后三行存储在一个数组中。我们仅在读取下一行之后的行时才打印一行。最后,我们从数组中取出最后两行,反转顺序并打印它。
更详细的代码说明:
我们将当前行([=11=]
)的内容存储在一个数组中。由于我们只需要跟踪读取的最后三行,因此数组的索引可以限制为值 0、1 和 2。我们通过使用模运算符 (NR % 3
).
当到达第三行时,我们打印最后一行 (if(NR>2)...
)。这是保存,因为在这种情况下,数组中还有两行我们可以单独处理。
当到达文件末尾时 (END{...}
),我们以相反的顺序打印最后两行。
为什么我们使用 NR%3
(而不是 NR%2
)?如果我们的输入文件中只有两行,则打印必须发生在 END
块中而不是之前!
这将交换最后两行并为其他行省略打印
$ tac cars | awk 'NR==1{getline one}
NR==2{print; print one}
NR>2{print "omitted"}' | tac
omitted
omitted
omitted
Plymouth,Fury,1992,2000
Dodge,charger,1989,5950
您可以添加格式。同样可以没有 tac
和 END
块中的逻辑。
更新:仅限 awk 的解决方案:在内存中保留两行,完成后以相反的顺序打印它们
$ awk 'NR>2{print pp}
{pp=p;p=[=11=]}
END{print p;print pp}' car
Ford,mondeo,1998,5800
ford,fiesta,1994,4575
Chevy,impala,1998,1000
Plymouth,Fury,1992,2000
Ford,F150,1991,1450
Dodge,charger,1989,5950