Comment savoir si un file text est un sous-set d'un autre

J'essaie de find un moyen de prédire si un file text est un sous-set d'un autre ..

Par exemple:

foo bar 

est un sous-set de

 foo bar pluto 

Tandis que:

 foo pluto 

et

 foo bar 

ne sont pas un sous-set l'un de l'autre.

Existe-t-il un moyen de prédire automatiquement cela?

Cette vérification doit être une vérification croisée, et doit returnner:

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

Si le contenu de ce file est appelé file1 , file3 et file3 dans l'ordre d'apparition, vous pouvez le faire avec l'un-liner suivant:

  # 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 

Si f1 est un sous-set de f2 alors f1 – f2 est un set vide. Sur la base de cela, nous pouvons écrire une fonction is_subset et une fonction dérivée de celle-ci. Selon Définir la différence entre 2 files text



 sort_files () {
   f1_sorted = "$ 1.sorted"
   f2_sorted = "$ 2.sorted"

   si [ !  -f $ f1_sorted];  puis
     chat 1 $ |  sortinger |  uniq> $ f1_sorted
   Fi

   si [ !  -f $ f2_sorted];  puis
     chat 2 $ |  sortinger |  uniq> $ f2_sorted
   Fi
 }

 remove_sorted_files () {
   f1_sorted = "$ 1.sorted"
   f2_sorted = "$ 2.sorted"
   rm -f $ f1_sorted
   rm -f $ f2_sorted
 }

 set_union () {
   sort_files $ 1 $ 2
   chat "$ 1.sorted" "$ 2.sorted" |  sortinger |  uniq
   remove_sorted_files $ 1 $ 2
 }

 set_diff () {
   sort_files $ 1 $ 2
   chat "$ 1.sorted" "$ 2.sorted" "$ 2.sorted" |  sortinger |  uniq -u
   remove_sorted_files $ 1 $ 2
 }

 rset_diff () {
   sort_files $ 1 $ 2
   chat "$ 1.sorted" "$ 2.sorted" "$ 1.sorted" |  sortinger |  uniq -u
   remove_sorted_files $ 1 $ 2
 }

 is_subset () {
   sort_files $ 1 $ 2
   sortie = $ (set_diff $ 1 $ 2)
   remove_sorted_files $ 1 $ 2

   si [-z $ output];  puis
     returnner 0
   autre
     returnner 1
   Fi

 }

J'ai trouvé une solution grâce à cette question

Fondamentalement, je teste deux files a.txt et b.txt avec ce script:

 #!/bin/bash first_cmp=$(diff --unchanged-line-format= --old-line-format= --new-line-format='%L' "$1" "$2" | wc -l) second_cmp=$(diff --unchanged-line-format= --old-line-format= --new-line-format='%L' "$2" "$1" | wc -l) if [ "$first_cmp" -eq "0" -o "$second_cmp" -eq "0" ] then echo "Subset" exit 0 else echo "Not subset" exit 1 fi 

Si l'un est un sous-set de l'autre, le script renvoie 0 pour True sinon.