Files
如何知道一個文本文件是否是另一個文件的子集
我正在嘗試找到一種方法來確定文本文件是否是另一個文件的子集..
例如:
foo bar
是的一個子集
foo bar pluto
儘管:
foo pluto
和
foo bar
不是彼此的子集…
有沒有辦法用命令做到這一點?
該檢查必須是交叉檢查,並且必須返回:
file1 subset of file2 : True file2 subset of file1 : True otherwise : False
如果這些文件內容被呼叫
file1
,file2
並且file3
按照外觀順序,那麼您可以使用以下單行程式碼來執行此操作:# python -c "x=open('file1').read(); y=open('file2').read(); print x in y or y in x" True # python -c "x=open('file2').read(); y=open('file1').read(); print x in y or y in x" True # python -c "x=open('file1').read(); y=open('file3').read(); print x in y or y in x" False
與
perl
:if perl -0777 -e '$n = <>; $h = <>; exit(index($h,$n)<0)' needle.txt haystack.txt then echo needle.txt is found in haystack.txt fi
-0octal
定義記錄分隔符。當該八進制數大於 0377(最大字節值)時,表示沒有分隔符,相當於做$/ = undef
. 在這種情況下,<>
返回單個文件的全部內容,即slurp 模式。一旦我們在兩個
$h
和$n
變數中獲得了文件的內容,我們就可以index()
用來確定是否在另一個中找到了一個。然而,這意味著整個文件都儲存在記憶體中,這意味著該方法不適用於非常大的文件。
對於 mmappable 文件(通常包括正常文件和大多數可查找
mmap()
的文件,如塊設備),可以通過使用文件來解決,例如使用Sys::Mmap
perl 模組:if perl -MSys::Mmap -le ' open N, "<", $ARGV[0] || die "$ARGV[0]: $!"; open H, "<", $ARGV[1] || die "$ARGV[1]: $!"; mmap($n, 0, PROT_READ, MAP_SHARED, N); mmap($h, 0, PROT_READ, MAP_SHARED, H); exit (index($h, $n) < 0)' needle.txt haystack.txt then echo needle.txt is found in haystack.txt fi