2013-10-29 90 views
0

我想分兩批文件。如果我簡單地將它們放在兩個不同的目錄中並按目錄進行比較,則比較將按照字母順序排列,這是我不想要的。diff兩批文件

另一種方法是列出text2.txt在text1.txt和列表文件的文件:

文本1:

a1 
b1 
c1 

文本2:

c2 
a2 
b2 

我怎樣才能接近這個使我的循環將是:

diff a1 c2 
diff b1 a2 
diff b2 c1 

回答

2

您可以使用paste加入這兩個文件,然後使用bash循環進行處理。

paste text1 text2 | while read file1 file2; do diff "$file1" "$file2"; done 
+0

非常好,它是一個班輪。你碰巧知道如何包含被擴散的文件名?這將是完美的 – Paolo

+0

@Paolo我不確定你到底在問什麼。你可以在'diff'命令之前加一個'echo'DIFF:$ file1,$ file2「;'來表示一組文件的差異的開始。 –

+0

我想打印diff文件名。這就是我正在尋找的東西:paste text1 text2 |同時讀取file1 file2; do diff --brief「$ file1」「$ file2」; diff -y --suppress-common-lines $ file1 $ file2;完成 – Paolo

2

在bash中,你可以使用閱讀-u標誌從不同的FD閱讀。這使您可以從兩個文件並行讀取:

while read -r -u3 file1 && read -r -u4 file2; do 
    diff "$file1" "$file2" 
done 3<file1.txt 4<file2.txt 
+0

'+ 1'只是因爲文件描述符很酷。 ':)' –

0

另一種解決方案:

#!/bin/bash 

file1="..." 
file2="..." 

getSize(){ 
    wc -l "$1"|cut -d " " -f1 
} 

getValueFromLineNumber(){ 
    sed -n "$1p" "$2" 
} 

diffFromLineNumber(){ 
    f1=$(getValueFromLineNumber "$1" "$file1") 
    f2=$(getValueFromLineNumber "$1" "$file2") 
    diff "$f1" "$f2" 
} 

# get min size 
[[ $(getSize "$file1") -le $(getSize "$file2") ]] && min=$s1 || min=$s2 

for ((i=1 ; i <= "$min" ; i++)); do 
    diffFromLineNumber "$i" 
done 

這種解決方案需要在兩個文件不具有相同的行數的情況下照顧。