2014-07-22 119 views
0

我得到了4個文件,我需要比較,我希望輸出顯示文件X中不存在於其他文件中的數字。Unix比較超過2個文件

這些文件由1列組成,其中每行都有一個數字。

我不能使用diff命令,因爲它不可用。

我試圖使用通訊,但輸出每次都是錯誤的。

感謝您的幫助。

+1

片段或樣品? – konsolebox

+0

@konsolebox你是什麼意思? – Necro1992

+0

我們必須有實際的數據來處理和預期的輸出,以幫助你。 – konsolebox

回答

0

考慮,我們有3個文件N1​​ N2 N3進行比較。

將文件中的所有值添加到新調出的文件中,並刪除重複項。然後比較每個文件與主「out」並輸出每個比較的缺失。然後在1個文件中添加缺失值,對它們進行排序並刪除重複項。

cat N1 N2 N3 | sort -u > out 
comm -2 -3 out $sort N1 > Missing1 
comm -2 -3 out $sort N2 > Missing2 
comm -2 -3 out $sort N3 > Missing3 
cat Missing1 Missing2 Missing3 | sort -u > Missing.txt 

感謝您的幫助:)

0

實際上這不是一件容易的事。你可以試試這個。它使用GNU awk。

gawk 'function report() { printf("File \"%s\" has different number of lines: %d\nIt should be %d\n", FILENAME, FNR, o); exit } NR == FNR { a[NR] = $0; ++o; next } FNR > o { report() } a[FNR] != $0 { printf("Line %d of file \"%s\" is different from line in file \"%s\": %s\nIt should be: %s\n", FNR, FILENAME, ARGV[1], $0, a[FNR]); exit } ENDFILE { if (ARGIND > 1 && FNR != o) report() }' file1 file2 file3 

腳本版本:

#!/usr/bin/gawk -f 
function report() { 
    printf("File \"%s\" has different number of lines: %d\nIt should be %d\n", 
     FILENAME, FNR, o) 
    exit 1 
} 
NR == FNR { 
    a[NR] = $0 
    ++o 
    next 
} 
FNR > o { 
    report() 
} 
a[FNR] != $0 { 
    printf("Line %d of file \"%s\" is different from line in file \"%s\": %s\nIt should be: %s\n", 
     FNR, FILENAME, ARGV[1], $0, a[FNR]) 
    exit 1 
} 
ENDFILE { 
    if (ARGIND > 1 && FNR != o) 
     report() 
} 

用法:

gawk -f script.awk file1 file2 file3 ... 
+0

嘿 我無法嘗試這個,因爲我有一個cygwin和腳本在Windows上的問題。 我發現了另一種解決方案,它適合少量文件比較 – Necro1992

+0

@ Necro1992沒關係。我只是想提供一個例子:) – konsolebox

0

如果你再裝VIM發出此命令

vim -d file1 file2 file3 ...