
我想編寫一個腳本,其中有兩個文件 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'
但是,如果有實際的如果兩個文件中都有空行,您將不會得到預期的結果。