2

我试图交织两个每行包含一个句子的文件。我将第一个文件的行间距加倍(sed G),我想将第二个文件的内容合并到那些空行中。

如何交织两个文件,使文件 B 的第一行低于文件 A 的第一行,文件 B 的第二行低于文件 A 的第二行,直到它到达末尾?

示例:[行号|句号|句子]

1  1 fileA
2   
3  2 fileA
4  
5  3 fileA
6  
7  4 fileA

预期结果:

1  1 fileA
2  1 FILEB
3  2 fileA
4  2 FILEB
5  3 fileA
6  3 FILEB
7  4 fileA

这是一个 bash 脚本:可以用sedor完成awk吗?

4

5 回答 5

7

这可能对您有用(GNU sed):

sed 'R fileB' fileA

您不需要先将文件空间加倍。

如果你想替换空行:

sed -e '/./!{R fileB' -e ';d}' fileA
于 2012-10-11T20:08:59.783 回答
2

如果您有原始的未加空格的文件,则可以使用pasteplus (GNU) sed。我假设Control-A您的句子中没有 ^A ( ) 字符:

paste -d'^A' fileA fileB | sed 's/^A/\n/'

paste命令连接两个文件中的行,然后sed用换行符替换标记 ^A。这适用于 GNU sed;BSD 不太好sed。您还可以使用awk

paste -d'^A' fileA fileB | awk '{sub(/^A/, "\n"); print}'

请记住在脚本Control-A中出现的位置键入。^A

您也可以使用 Perl 轻松完成,它只需要一个进程而不是这里的两个进程。


我还想到您可以使用 转换控制字符tr,这可以说更简单:

paste -d'^A' fileA fileB | tr '\001' '\012'  # octal escapes for ^A and NL
于 2012-10-11T20:40:32.640 回答
2

如果您将第一个文件取消双倍空间(例如使用sed -n 1~2p),则可以使用paste换行符分隔符(使用 GNU 粘贴测试):

paste -d'\n' file1 file2

使用Birei回答中的文件进行测试:

fileA 1
fileB 1
fileA 2
fileB 2
fileA 3
fileB 3
于 2012-10-15T14:32:50.703 回答
1

使用awk

假设fileA有数据:

fileA 1
fileA 2
fileA 3

fileB

fileB 1
fileB 2
fileB 3

运行以下脚本:

awk 'FNR < NR { exit; } { getline lineB <ARGV[ARGC-1]; printf "%s\n%s\n", $0, lineB; }' fileA fileB

这会产生:

fileA 1
fileB 1
fileA 2
fileB 2
fileA 3
fileB 3
于 2012-10-11T20:23:49.087 回答
1

另一个例子:

文件 1

fileA 1
fileA 2
fileA 3

文件2

fileB 1
fileB 2
fileB 3

命令:

awk '{getline a < "file2" split(a, b, FS); print NR, $2, $1 "\n" NR+++1, b[2], b[1] }' file1

结果:

$ awk '{getline a < "file2" split(a, b, FS); print NR, $2, $1 "\n" NR+++1, b[2], b[1] }' file1
1 1 fileA
2 1 fileB
3 2 fileA
4 2 fileB
5 3 fileA
6 3 fileB
于 2012-10-11T21:04:40.953 回答