如何在Bash中逐行合并两个文件

222
我有两个文本文件,每个文件中都包含一行信息,例如:
file1.txt            file2.txt
----------           ---------
linef11              linef21
linef12              linef22
linef13              linef23
 .                    .
 .                    .
 .                    .

我想要使用Bash脚本逐行合并这些文件,以便获得:

fileresult.txt
--------------
linef11     linef21
linef12     linef22
linef13     linef23
 .           .
 .           .
 .           .

如何在Bash中实现这个功能?

5个回答

348
您可以使用 paste 命令:
paste file1.txt file2.txt > fileresults.txt

2
如果我想使用分隔符,它是如何工作的? - Teja
15
@SOaddict paste -d "\n" * > results.txt - Ostap Maliuvanchuk
paste 命令将使用制表符分隔每一列,除非您使用 -d 选项进行覆盖,因此您可以使用 awksed 等工具来格式化每一行。例如:paste file1.txt file2.txt | awk '{printf "%-61s | %s\n", $1,$2}' ... 这将模仿 diff --side-by-side 的输出。 - Yzmir Ramirez
5
使用paste -d ""可以将多行文本连接为一行,没有分隔符和空格。 - Victoria Stuart

25
这里提供了非粘贴方法。
awk
awk 'BEGIN {OFS=" "}{
  getline line < "file2"
  print $0,line
} ' file1

Bash

exec 6<"file2"
while read -r line
do
    read -r f2line <&6
    echo "${line}${f2line}"
done <"file1"
exec 6<&-

15

试试以下方法。

pr -tmJ a.txt b.txt > c.txt

3
此外,如果您想更改分隔符,请使用 -s 选项。 (+1) - user.friendly
J 选项在 macOS Mojave 上不起作用,但您的命令完美地运行。谢谢。 - Duck

10

检查

man paste

可能后跟一些命令,例如untabifytabs2spaces


在Emacs中使用M-x replace-string命令可以去除制表符,Vim和其他一些文本编辑器也可能能够实现。 - Ben
11
使用“-d”选项来指定除制表符以外的分隔符。 - Pedru

5

如果你想要在文件中合并并分离两段文本,可以使用带有分隔符选项的粘贴功能。

paste -d "," source_file1 source_file2 > destination_file

如果不指定分隔符,将使用制表符分隔符合并两个文本文件。

paste source_file1 source_file2 > destination_file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接