交织两个文件bash脚本

时间:2012-10-11 19:57:27

标签: bash sed awk

我正在尝试交织两个每行包含一个句子的文件。我将第一个文件加倍间隔(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完成?

5 个答案:

答案 0 :(得分:7)

这可能适合你(GNU sed):

sed 'R fileB' fileA

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

如果你想要替换空行:

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

答案 1 :(得分:2)

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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:1)

另一个例子:

<强>文件1

fileA 1
fileA 2
fileA 3

<强> file2的

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