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.