![如何交错两个或多个文件的行?](https://linux22.com/image/39213/%E5%A6%82%E4%BD%95%E4%BA%A4%E9%94%99%E4%B8%A4%E4%B8%AA%E6%88%96%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E8%A1%8C%EF%BC%9F.png)
我试图将 2 个文件输出到一个文件中。我尝试过以下命令:
cat file1 file2
但这里file2
数据附加到file1
.
我需要的是第一行,file1
然后是第一行,第二行,然后是第二行,等等。file2
file1
file2
谁能告诉我如何以简单的方式做到这一点?
答案1
有一个应用程序可以做到这一点!
$ cat file1
file1 line1
file1 line2
$ cat file2
file2 line1
file2 line2
现在,如果您将这些文件作为参数传递给paste
:
$ paste -d' ' file1 file2
file1 line1 file2 line1
file1 line2 file2 line2
如果“file1 第一行后跟 file2 第一行,file1 第二行后跟 file2 第二行等”,您的意思是您希望在粘贴的每一行之间有一个新行,只需调整-d
(分隔符) 选项即可。
$ paste -d'\n' file1 file2
file1 line1
file2 line1
file1 line2
file2 line2
答案2
POSIX awk;这适用于任意数量的文件,并且文件甚至不必具有相同数量的行。该脚本将继续运行,直到所有文件都超出行数:
BEGIN {
do {
br = ch = 0
while (++ch < ARGC)
if (getline < ARGV[ch]) {
printf ch < ARGC - 1 ? $0 FS : $0 RS
br = 1
}
} while (br)
}
答案3
快速解决方案
# Takes as many file arguments as needed
function InterleaveFiles {
local counter=0
local hasLine=true
while [ $hasLine == true ]; do
hasLine=false
for i in "$@"; do
line=$(awk 'NR == num_line {print; exit}' num_line=$((counter+1)) "$i")
if [ -n "$line" ]; then
echo "$line"
hasLine=true
fi
done
counter=$((counter+1))
done
}
InterleaveFiles 文件 1 文件 2 文件 3 文件 4
答案4
paste -d '\n' file1 file2 > file3
其中file1
和file2
是输入文件,file3
将是创建的输出。