如何同時從兩個文件讀取並逐行列印它們,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'

但是,如果有實際的如果兩個文件中都有空行,您將不會得到預期的結果。

相關內容