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

7

我有两个文件,它们的内容如下:

文件1

Line1file1
Line2file1
line3file1
line4file1

文件2

Line1file2
Line2file2
line3file2
line4file2

我希望将这些文件的内容合并到File3中。
Line1file1
Line1file2
Line2file1
Line2file2
line3file1
line3file2
line4file1
line4file2

如何在bash中将两个文件的内容按顺序合并?

谢谢。

5个回答

13

您总是可以使用paste命令。

paste -d"\n" File1 File2 > File3

2
$ 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

2

粘贴是解决这个问题的方法,但如果您需要添加额外的条件或不想在一个文件比另一个文件多时出现空行或其他使问题更加复杂的情况下,此替代方法可能会有用:

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

需要什么才能获得这样的输出: Line1file1 line3file1 Line1file2 line3file2 Line2file1 line4file1 Line2file2 line4file2(并排显示) - Skeptic
请发布一个新的跟进问题,不要在评论中提出跟进问题。 - Ed Morton

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

如果您使用的是OS X,sed命令请使用-E而不是-r。具体思路如下:
  1. 使用grep为每个文件编号。
  2. 使用sed删除文件名,并将行号放入以空格分隔的列中。
  3. 使用sort -n按行号排序,这是稳定的并保留文件顺序。
  4. 使用cut删除行号并将其重定向到文件。
编辑:使用paste更简单,但如果其中一个文件比另一个文件长,则会导致空行,此方法只会继续使用较长文件的行。

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

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


2
这只是将文件附加到一起,他想要从每个文件中获取交替行。 - Raj Srivastava
它还会从每行中剥离前导和尾随的空格,并展开转义序列。如果文件包含printf格式化字符(例如%s),则会产生语法错误和/或其他不良行为,并且速度非常缓慢。这只是另一个例子,说明在操作文本时,在shell中编写循环总是错误的方法。 - Ed Morton

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