我想编写一个脚本,其中有两个文件 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 行,您将无法判断它是否来自file1
或file2
。根据 的实际行为paste
,您会知道它来自file2
,因为它是输出的偶数行号。
tr -s '\n'
您可以像这样通过管道输出:
paste -d '\n' file1 file2 | tr -s '\n'
但是,如果有实际的如果两个文件中都有空行,您将不会得到预期的结果。