2013-05-02 43 views
2

首先,我很抱歉,這可能是一個相當愚蠢的問題,但並不完全屬於此處。如何確定一個文件的內容是否包含在另一個文件的內容中

這是我的問題:我有兩個大文本文件包含大量文件名稱,我們稱它們爲A和B,並且我想確定A是否爲B的子集,無視順序,即對於每個文件名A,找到文件名是否也在B中,否則A不是子集。

我知道如何對文件進行預處理(除去文件名本身,除去不同的大寫字母),但現在我只是想知道是否有一種簡單的方法來使用shell命令執行任務。

差異可能不起作用,對吧?即使我首先對這兩個文件進行「排序」,至少兩個文件的排列順序是相同的,因爲A可能是B的子集,diff會告訴我每一行都是不同。

再說一遍,如果這個問題不屬於這裏,並且最後如果沒有簡單的方法去做,我只會寫一個小程序來完成這項工作,但是因爲我試圖更好地處理shell命令,我想我會先在這裏問。

+0

好問題! +1;)使用'sort'和'diff'的問題是什麼?看起來不錯。 – hek2mgl 2013-05-02 23:53:23

+0

也許是我的差異的理解是缺乏的,但說文件A包含: AAA CCC 和B包含: AAA BBB CCC 差異只會告訴我,第2行是不匹配的,但我想要的它要做的是告訴我ccc是*在某處發現的。如果diff的選項存在,即使在閱讀手冊頁之後,我也不知道它。 – tonfagun 2013-05-02 23:58:41

+0

所以你想做一個基於行的包括檢查,而不是基於塊(文件的整個內容作爲塊)? – Kent 2013-05-03 00:09:05

回答

11

這樣做:

cat b | sort -u | wc 
cat a b | sort -u | wc 

如果你得到同樣的結果,A是B的子集。

+0

不錯! ......... – hek2mgl 2013-05-02 23:54:53

+0

似乎工作(在兩個小測試文件)。現在我只需要找出它爲什麼會起作用。但那是我的問題,所以:謝謝! – tonfagun 2013-05-03 00:08:20

+0

現在得到它:)非常聰明的解決方案。 – tonfagun 2013-05-03 00:22:55

0

這裏是如何做到這一點的AWK

awk ' 
    # read A, the supposed subset file 
    FNR == NR {a[$0]; next} 
    # process file B 
    $0 in a {delete a[$0]} 
    END {if (length(a) == 0) {print "A is a proper subset of B"}} 
' A B 
0

測試如果XSD文件是WSDL文件的一個子集:

xmllint --format file.wsdl | awk '{$1=$1};1' | sort -u | wc 
xmllint --format file.wsdl file.xsd | awk '{$1=$1};1' | sort -u | wc 

這適應使用RichieHindle事先answer優雅的概念:

  1. xmllint --format而不是cat,以漂亮的打印XM L,因此每個XML元素都在一行上,如sort -u | wc所要求的那樣。其他漂亮的打印命令可能在這裏工作,用於json的jq .
  2. awkcommand以規範化空白:剝離前導和尾隨(因爲兩個文件中的縮進不同),並摺疊內部。警告:不考慮元素內的XML屬性順序。
相關問題