问题描述
cat 文件1
foo
ice
two
cat 文件2
bar
cream
hundred
期望的输出:
foobar
icecream
twohundred
在我的场景中,file1 和 file2 将始终具有相同数量的行,以防万一让事情变得更容易。
最佳思路
这项工作的正确工具可能是 paste
paste -d '' file1 file2
有关详细信息,请参阅 man paste
。
您还可以使用 pr
命令:
pr -TmJS"" file1 file2
在哪里
-
-T
关闭分页 -
-mJ
合并文件,加入整行 -
-S""
用空字符串分隔列
如果您真的想使用纯 bash shell(不推荐)来做到这一点,那么这就是我的建议:
while IFS= read -u3 -r a && IFS= read -u4 -r b; do
printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2
(仅包含此内容是因为该主题出现在对另一个提议的 pure-bash 解决方案的评论中。)
次佳思路
通过awk方式:
awk '{getline x<"file2"; print $0x}' file1
-
getline x<"file2"
从 file2 读取整行并保存到 x 变量中。 -
print $0x
通过使用$0
和x
打印 file1 中的整行,x
是 file2 的保存行。
第三种思路
paste
是要走的路。如果你想检查一些其他的方法,这里是一个 python
解决方案:
#!/usr/bin/env python2
import itertools
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
lines = itertools.izip_longest(f1, f2)
for a, b in lines:
if a and b:
print a.rstrip() + b.rstrip()
else:
if a:
print a.rstrip()
else:
print b.rstrip()
如果您的行数很少:
#!/usr/bin/env python2
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
print '\n'.join((a.rstrip() + b.rstrip() for a, b in zip(f1, f2)))
请注意,对于不相等的行数,此行将在最先结束的文件的最后一行结束。
第四种思路
此外,使用纯 bash
(请注意,这将完全忽略空行):
#!/bin/bash
IFS=$'\n' GLOBIGNORE='*'
f1=($(< file1))
f2=($(< file2))
i=0
while [ "${f1[${i}]}" ] && [ "${f2[${i}]}" ]
do
echo "${f1[${i}]}${f2[${i}]}" >> out
((i++))
done
while [ "${f1[${i}]}" ]
do
echo "${f1[${i}]}" >> out
((i++))
done
while [ "${f2[${i}]}" ]
do
echo "${f2[${i}]}" >> out
((i++))
done