交织两个文件bash 脚本



>我正在尝试交织两个每行包含一个句子的文件。我将第一个文件加倍行距(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 脚本的:可以用 sedawk来完成吗?

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

sed 'R fileB' fileA

您不需要先将文件加倍行距。

如果要替换空行:

sed -e '/./!{R fileB' -e ';d}' fileA

如果您有原始的无空格文件,则可以使用 paste plus (GNU) sed 。 我假设您的句子中没有^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}'

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

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


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

paste -d'^A' fileA fileB | tr '01' '12'  # octal escapes for ^A and NL

如果你对第一个文件进行双倍行距(例如,用 sed -n 1~2p ),你可以使用带有换行符的paste(用 GNU 粘贴测试):

paste -d'n' file1 file2

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

fileA 1
fileB 1
fileA 2
fileB 2
fileA 3
fileB 3

使用 awk

假设文件 A 包含数据:

fileA 1
fileA 2
fileA 3

文件B与:

fileB 1
fileB 2
fileB 3

运行以下脚本:

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

这会产生:

fileA 1
fileB 1
fileA 2
fileB 2
fileA 3
fileB 3

另一个例子:

文件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

相关内容

  • 没有找到相关文章

最新更新