使用 sed 或 awk 以某种模式连接行?

mir*_*lol 6 sed awk text-processing

不确定如何打开此输入:

A
B
C
apartner
bpartner
cpartner
Run Code Online (Sandbox Code Playgroud)

进入这个输出:

A apartner
B bpartner
c cpartner
Run Code Online (Sandbox Code Playgroud)

我在一个需要 40 行的 80 行文件中有这个模式。另外,我该如何附上每个项目,比如说,<il><b>A</b> <i>apartner</i></il>

don*_*sti 8

使用prcoreutils

pr -2 -t -l 40 -s' ' $oldfile > $newfile
Run Code Online (Sandbox Code Playgroud)

使用相同的pr和添加标签sed

pr -2 -t -l 40 -J -S'</b> <i>' $oldfile | sed 's|^|<il><b>|;s|$|</i></il>|' > $newfile
Run Code Online (Sandbox Code Playgroud)

输出:

<il><b>A</b> <i>apartner</i></il>
<il><b>B</b> <i>bpartner</i></il>
<il><b>C</b> <i>cpartner</i></il>
Run Code Online (Sandbox Code Playgroud)


Hau*_*ing 5

[GNU]

如果不是重要的是使用sed还是awk那么我建议这是最简单的解决方案:

首先,您将文件分成两部分:

head -n 40 file >file1
tail -n 40 file >file2
Run Code Online (Sandbox Code Playgroud)

然后你组合这些行:

paste --delimiters=" " file1 file2
Run Code Online (Sandbox Code Playgroud)

当然headtail您可以使用sedor代替and awk

sed -n -e 1,40p combinedfile >file1
sed -n -e 41,80p combinedfile >file2
awk 'NR < 41 {print;}' combinedfile >file1
awk 'NR > 40 {print;}' combinedfile >file2
Run Code Online (Sandbox Code Playgroud)

好的,我才意识到:纯 awk 解决方案并不像我想象的那么复杂:

awk 'NR < 41 { lines[NR]=$0; next; }; {print lines[NR-40],$0}' combinedfile
Run Code Online (Sandbox Code Playgroud)

  • 您可以跳过创建 file1 和 file2:`paste &lt;(head -40 file) &lt;(tail -40 file)` (2认同)