>我正在尝试交织两个每行包含一个句子的文件。我将第一个文件加倍行距(sed G
),我想将第二个文件的内容合并到这些空行中。
低于文件 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
来完成吗?
这可能对你有用(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