2013-02-27 64 views
0

我想同時處理兩個文件中的文本。bash腳本 - 爲什麼不打開第一個文件?

fname3=XX1.txt fname2=XX2.txt 


while read -r -u3 line1; read -r -u4 line2; do 
    echo "$line1:$line2"; 
done 3< "$fname3" 4< "$fname2" 

輸出總是顯示「:(文本)」,我期望它輸出「(文本):(文本)」。 檔案很大,有關係嗎?

+0

對我的作品... – 2013-02-27 21:23:34

+0

我複製bash腳本到另一個文件。第一個文件有效,但第二個文件不起作用,複製腳本是否重要?這些文件真的很大...... – wagashi 2013-02-27 21:33:28

+0

你在尋找'paste -d:XX1.txt XX2.txt'嗎? – tripleee 2013-02-27 21:36:05

回答

3

這適用於任何大小的文件。這裏有一個完整的,自包含的腳本,演示它的百萬行的文件:

#!/bin/bash 
printf "foo%s\n" {1..1000000} > XX1.txt 
printf "bar%s\n" {1..1000000} > XX2.txt 

fname3=XX1.txt fname2=XX2.txt 

while read -r -u3 line1; read -r -u4 line2; do 
    echo "$line1:$line2"; 
done 3< "$fname3" 4< "$fname2" 

輸出是:

foo1:bar1 
foo2:bar2 
... 
foo999999:bar999999 
foo1000000:bar1000000 

如果第一個文件比第二較短,最後剩下的行會直到第二個文件完全被讀取爲止。如果第二個文件較短,則腳本將在完成時停止並忽略第一個文件的其餘部分。

要停止當任何文件用盡行,請使用&&而不是;來分隔讀取語句。要閱讀,直到兩個文件不在同一行,請使用||

+0

請在我的問題下閱讀我的意見。 – wagashi 2013-02-27 21:38:07

+0

我做了,並且更新了這個例子,以揭穿你對大文件的理論。也許你想提供你自己的測試用例來證明問題? – 2013-02-27 21:45:30

+0

啊,第一個文件比第二個文件少10行。不過,我仍然得到相同的輸出。我還在輸出中顯示錯誤:「Error:near」s「:syntax error」這是一個sqlite錯誤,但是這個錯誤是什麼意思? – wagashi 2013-02-27 21:50:18

0

如果你想要做的是串聯相應的線,使用paste

paste -d : $fname3" "$fname2" 
+0

請在我的問題下閱讀我的意見。它不是連接我想要的,除此之外,我不能同時從兩個文件逐行閱讀。 – wagashi 2013-03-01 07:06:12

相關問題