我正在尝试交织两个每行包含一个句子的文件。我将第一个文件加倍间隔(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脚本:是否可以使用sed
或awk
完成?
答案 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