如何使用sed/awk切换/旋转每两行?

12 regex awk sed

我一直在手工做这个,我不能再做了 - 我有几千行,我认为这是sed或awk的工作.

基本上,我们有一个这样的文件:

A sentence X
A matching sentence Y
A sentence Z
A matching sentence N
Run Code Online (Sandbox Code Playgroud)

此模式将继续整个文件.我想翻转每个句子和匹配句子,这样整个文件最终会像:

A matching sentence Y
A sentence X
A matching sentence N
A sentence Z
Run Code Online (Sandbox Code Playgroud)

有小费吗?

编辑:扩展初始问题

Dimitre Radoulov为最初的问题提供了一个很好的答案.这是主要问题的延伸 - 更多细节:

假设我们有一个有组织的文件(由于Dimitre提供的sed行,文件是有组织的).但是,现在我想按字母顺序组织文件,但只使用第二行的语言(英语).

watashi 
me
annyonghaseyo
hello
dobroye utro!
Good morning!
Run Code Online (Sandbox Code Playgroud)

我想按英文句子(每第2句)按字母顺序排列.鉴于以上输入,这应该是输出:

dobroye utro!
Good morning!
annyonghaseyo
hello
watashi
me 
Run Code Online (Sandbox Code Playgroud)

Juk*_*nen 17

对于问题的第一部分,这里是一种在sed中互相交换每一行而不使用正则表达式的方法:

sed -n 'h;n;p;g;p'
Run Code Online (Sandbox Code Playgroud)

-n命令行抑制自动打印.命令h将当前行从模式空间复制到保留空间,n读取模式空间的下一行并p打印它; g将第一行从保留空间复制回模式空间,将第一行复制回模式空间,然后p打印它.

  • 如果输入具有奇数行,则不输出最后一行.如果需要输出该行:`sed -n'$ p; h; n; p; g; p'` (3认同)
  • 如果将`g`更改为`G`,则只需要最后一个`p`. (2认同)

Dim*_*lov 9

sed 'N; 
s/\(.*\)\n\(.*\)/\2\
\1/' infile
Run Code Online (Sandbox Code Playgroud)

N- 将下一行输入附加到模式空间中
\(.*\)\n\(.*\)- 将模式空间的匹配部分保存在换行符之前和之后.
\2\\ \1 - 交换两条线(\ 1是第一个保存的部分,\ 2是第二个).使用转义的文字换行符来实现可移植性

对于某些sed实现,您可以使用转义序列\n:\2\n\1而不是.


gle*_*man 6

第一个问题:

awk '{x = $0; getline; print; print x}' filename
Run Code Online (Sandbox Code Playgroud)

下一个问题:按第二行排序

paste - - < filename | sort -f -t $'\t' -k 2 | tr '\t' '\n'
Run Code Online (Sandbox Code Playgroud)

哪个输出:

dobroye utro!
Good morning!
annyonghaseyo
hello
watashi
me
Run Code Online (Sandbox Code Playgroud)