我有两个文件:叫t1.txt
和t2.txt
.内容是:
t1.txt
a
b
c
t2.txt
ab
bc
cd
现在我想将这两个文件逐行合并到 t3.txt 中,以便 t3.txt 应该如下所示:
t3.txt
aab
bbc
ccd
请帮助使用 shell 脚本获取输出。
答案1
粘贴和sed
有更有效的方法,但这里有一个使用paste
和 的快速但肮脏的方法sed
。
$ paste -d":" t1.txt t2.txt | sed 's/://g'
aab
bbc
ccd
上面连接了两个文件,如下所示:
a:ab
b:bc
c:cd
并且sed
删除了:
.
只需粘贴
您可以放弃使用,在加入文件时sed
告诉不使用任何内容作为分隔符有点多余:paste
$ paste -d "" t1.txt t2.txt
aab
bbc
ccd
awk
您还可以使用awk
以下方法来执行此操作:
$ awk 'NR==FNR{a[FNR]=$0;next} {print a[FNR] $0}' t1.txt t2.txt
aab
bbc
ccd
这将循环遍历第一个文件 ,t1.txt
并将其存储在数组 中a[FNR]
。是FNR
该数组的索引,基于文件中每行所在的行号t1.txt
。然后,它循环遍历第二个文件t2.txt
,并打印第一个文件中与第二个文件相对应的行。
连接 & awk & nl
这种方法有点复杂,但很有效,并且在使用时使繁重的工作变得不那么复杂awk
,就发生的情况而言。
$ join <(nl t1.txt) <(nl t2.txt)|awk '{print $2 $3}'
aab
bbc
ccd
这些nl ...
命令生成带有行号的测试文件版本:
$ nl t1.txt
1 a
2 b
3 c
然后该join
命令使用这些行号作为两个文件共有的数据片段,因此它可以加入它。
$ join <(nl t1.txt) <(nl t2.txt)
1 a ab
2 b bc
3 c cd
awk
最后使用 来提取上面的第二列和第三列。
pr 和 awk
这个很少使用的pr
命令也可用于通过其合并开关来连接文件-m
。
$ pr -t -m t1.txt t2.txt | awk '{print $1 $2}'
aab
bbc
ccd
答案2
paste -d '\0' t1.txt t2.txt > t3.txt
不,它不包含两个文件之间的 NUL 字符。
是的,它是标准的 (POSIX) 和可移植的,并且是您可以获得的最高效的。
答案3
从 BASH shell 尝试运行(无需任何额外的文本处理工具):
exec 3< t1.txt
exec 4< t2.txt
while read l1 <&3 && read l2 <&4; do
echo ${l1}$l2
done > t3.txt