将 3 条重复线中的两条线反转

将 3 条重复线中的两条线反转

我有一个这样的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_1var_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

相关内容