在 bash 中将两个文件的内容合并为一个文件

merge contents of two files into one file in bash

我有两个包含以下内容的文件

文件 1

Line1file1
Line2file1
line3file1
line4file1

文件 2

Line1file2
Line2file2
line3file2
line4file2

我想将这些文件的内容合并到 file3 as

文件 3

Line1file1
Line1file2
Line2file1
Line2file2
line3file1
line3file2
line4file1
line4file2

如何在 bash 中连续合并一个文件和另一个文件的文件?

谢谢

while read line1 && read -u 3 line2
do 
    printf "$line1\n" >> File3
    printf "$line2\n" >> File3
done < File1 3<File2

您可以使用文件描述符,从两个文件中读取并将每一行打印到输出文件。

在Linux中:

grep -En '.?' File1 File2 | sed -r 's/^[^:]+:([^:]+):(.*)$/ /g' \
    | sort -n | cut -d' ' -f2- > File3

如果您使用的是 OS X,请对 sed 命令使用 -E 而不是 -r。思路是这样的:

  1. 使用grep为每个文件的行编号。
  2. 使用 sed 删除文件名并将行号放入 space 分隔的列中。
  3. 使用sort -n按行号排序,稳定且保留文件顺序。
  4. cut 删除行号并重定向到文件。

编辑: 使用 paste 更简单,但如果您的文件中的一个文件比另一个文件长,则会导致空行,此方法只会继续行从较长的文件。

您可以随时使用 paste 命令。

paste -d"\n" File1 File2 > File3
$ cat file1
Line1file1
Line2file1
line3file1
line4file1

$ cat file2
Line1file2
Line2file2
line3file2
line4file2

$ paste -d '\n' file1 file2 > file3

$ cat file3
Line1file1
Line1file2
Line2file1
Line2file2
line3file1
line3file2
line4file1
line4file2

paste 是解决此问题的方法,但如果您需要添加额外条件或不想在一个文件包含更多条件时以空行结尾,则此替代方法可能是一种有用的方法比其他行或其他任何使它成为更复杂问题的行:

$ awk -v OFS='\t' '{print FNR, NR, [=10=]}' file1 file2 | sort -n | cut -f3-
Line1file1
Line1file2
Line2file1
Line2file2
line3file1
line3file2
line4file1
line4file2