
引数として 2 つのファイル F1 と F2 を持ち、それらを交互に印刷するスクリプトを作成したいと思います。最初に F1 の最初の行が書き込まれ、次に F2'2 の 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
シェルスクリプトは必要ありません。 を使って直接これを行うことができますpaste
。POSIXで規定:
paste -d '\n' file1 file2
ただし、説明されているような方法では異なる行数は処理されません。仕様を引用すると、次のようになります。
1つ以上の入力ファイルでファイル終了条件が検出された場合、すべての入力ファイルで検出されたわけではないが、ペーストファイルの終わりが検出されたファイルから空行が読み取られたかのように動作します。
個人的には、質問で説明されているような動作をするのは間違いだと思います。出力の 24 行目を見ても、それが から来たのか から来たのかはわかりませんfile1
。file2
の実際の動作ではpaste
、出力の行番号が偶数なので、 から来たことがわかりますfile2
。
出力をtr -s '\n'
次のようにパイプすることができます:
paste -d '\n' file1 file2 | tr -s '\n'
しかし、もし実際のどちらかのファイルに空白行があると、期待どおりの結果が得られません。