如何同时从两个文件读取并逐行打印它们,bash?

如何同时从两个文件读取并逐行打印它们,bash?

我想编写一个脚本,其中有两个文件 F1 和 F2 作为参数,并交替打印它们;首先将写入 F1 的第一行,然后写入 F2'2 的第二行,依此类推。如果其中一个的行数比另一个少,那么当我们打印完较短的一行时,脚本应该写入最长的行,直到最后。

我的想法是:

1) 检查是否没有 2 个参数 -> echo 并退出 2) 检查 F1 或 F2 是否不是文件 -> echo 并退出 3) 正文:

exec 3 < $1
exec 4 < $2
i=0
j=1
while read -u 3 line && ((i==0))
do
echo line; echo
 ((i++))
((j--))
    while read -u 4 line && ((j==0))
    do
        echo line; echo
 ((j++))
((i--))
   done
 done
 exit $?

疑问:只有当两个文件具有相同的行数时,这才有效。我如何改进这一点以将此解决方案扩展到不同大小的文件?

答案1

不需要 shell 脚本。您可以直接使用 执行此操作paste,即由 POSIX 指定

paste -d '\n' file1 file2

但是,它不会按照您描述的方式处理不同的行数。引用规格:

如果在一个或多个输入文件(但不是所有输入文件)上检测到文件结束条件,粘贴应表现得好像从检测到文件结尾的文件中读取空行......

我个人认为,做出您在问题中描述的行为是错误的。查看输出的第 24 行,您将无法判断它是否来自file1file2。根据 的实际行为paste,您会知道它来自file2,因为它是输出的偶数行号。

tr -s '\n'您可以像这样通过管道输出:

paste -d '\n' file1 file2 | tr -s '\n'

但是,如果有实际的如果两个文件中都有空行,您将不会得到预期的结果。

相关内容