我有一个这样的txt文件
AAAAAAAAAA
BBBBBBBBBB
CCCCCCCC
DDDDDDDDDDD
EEEEEEEEEEE
FFFFFFFFFFF
GGGGGGGGGGG
HHHHHHHHHHH
IIIIIIIIIII
每组 3 行,中间有换行符。
我想反转每组的前两行,使文件像这样
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC
EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF
HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII
我如何从终端做到这一点?
编辑:我已将文本文件的示例上传到这里如果你需要测试你的答案。
答案1
$ cat -n ip.txt
1 AAAAAAAAAA
2 BBBBBBBBBB
3 CCCCCCCC
4
5 DDDDDDDDDDD
6 EEEEEEEEEEE
7 FFFFFFFFFFF
8
9 GGGGGGGGGGG
10 HHHHHHHHHHH
11 IIIIIIIIIII
由于它是固定格式,因此相应地使用模运算符
$ awk 'NR%4==1{s=$0; next} 1; NR%4==2{print s}' ip.txt
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC
EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF
HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII
和一个perl
有趣的正则表达式版本
perl -00 -pe 's/(\N+\n)(\N+\n)/$2$1/' ip.txt
-00
段落模式,类似于 awk 的-v RS=
- 然后交换前两行
- 还可以使用
(\N+\n)((?1))
- 如果需要重复复杂的正则表达式,则很有用
- 还可以使用
答案2
一种方法 - 使用 GNU awk:
gawk 'BEGIN{RS=""; OFS=FS="\n"} {tmp = $2; $2 = $1; $1 = tmp; ORS=RT} 1' file
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC
EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF
HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII
答案3
sed -n 'h; n; G; N; p; n; p' input.txt
解释
它sed
有两个操作空间 - 等待空间和模式空间。它们就像两个变量 -var_1
和var_2
。每个输入行都会进入模式空间,但您可以复制(它替换保留空间的所有内容)或将其附加到保留空间。因此:
h
- 将模式空间复制到保留空间。现在,模式空间和保持空间都是:AAAAA
。n
- 将下一行输入获取到模式空间中。所以,模式空间现在是:BBBBB
。G
- 将换行符和保持空间(AAAAA
) 的内容附加到模式空间,因此模式空间是现在的BBBBB\nAAAAA
。N
- 将换行符和下一行输入附加到模式空间 -BBBBB\nAAAAA\nCCCCC
p
- 打印模式空间。n
- 获取模式空间的下一行输入(如果存在),否则退出(如果到达文件末尾)。p
- 再次打印模式空间。
输出
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC
EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF
HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII