Files

如何知道一個文本文件是否是另一個文件的子集

  • July 13, 2019

我正在嘗試找到一種方法來確定文本文件是否是另一個文件的子集..

例如:

foo
bar

是的一個子集

foo
bar
pluto

儘管:

foo
pluto

foo
bar

不是彼此的子集…

有沒有辦法用命令做到這一點?

該檢查必須是交叉檢查,並且必須返回:

file1 subset of file2 :    True
file2 subset of file1 :    True
otherwise             :    False

如果這些文件內容被呼叫file1file2並且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::Mmapperl 模組:

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

引用自:https://unix.stackexchange.com/questions/114877