两个文件的两个字段的串联

两个文件的两个字段的串联

我有两个文件:叫t1.txtt2.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

相关内容