J'ai deux fichiers:
fichier 1
dsf
sdfsd
dsfsdf
fichier 2
ljljlj
lkklk
dsf
sdfsd
dsfsdf
Je veux afficher ce qui est dans le fichier 2 mais pas dans le fichier 1, donc le fichier 3 devrait ressembler
ljljlj
lkklk
Tu peux essayer
grep -f file1 file2
ou
grep -v -F -x -f file1 file2
grep -Fxvf file1 file2
Que signifient les drapeaux:
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
-x, --line-regexp
Select only those matches that exactly match the whole line.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing.
Vous pouvez utiliser la commande comm
pour comparer deux fichiers triés.
comm -13 <(sort file1) <(sort file2)
J'ai utilisé avec succès
diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"
Sortie de la différence dans un fichier.
si vous les attendez dans un certain ordre, vous pouvez simplement utiliser diff
diff file1 file2 | grep ">"
join -v 2 <(sort file1) <(sort file2)
A essayé une légère variation sur la réponse de Luca et cela a fonctionné pour moi.
diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file
Notez que le motif recherché dans sed est un >
suivi d'un espace.
file1 m1 m2 m3 file2 m2 m4 m5 > awk 'NR == FNR {file1 [$ 0] ++; next}! ($ 0 dans fichier1) 'fichier1 fichier2 m4 m5 > awk' NR == FNR {fichier1 [$ 0] ++; next} ($ 0 dans fichier1) 'fichier1 fichier2 m2 > Quelle est la commande awk pour obtenir' m1 et m3 '?? comme dans file1 et pas dans file2? m1 m3
Si vous voulez utiliser des boucles, vous pouvez essayer comme ceci: (diff et cmp sont beaucoup plus efficaces.)
while read line
do
flag = 0
while read line2
do
if ( "$line" = "$line2" )
then
flag = 1
fi
done < file1
if ( flag -eq 0 )
then
echo $line > file3
fi
done < file2
Remarque: le programme n'a pour but que de fournir un aperçu de base de ce qui peut être fait si vous ne voulez pas utiliser d'appels système tels que diff n comm ..
une réponse awk:
awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2
Avec GNU sed
:
sed 's#[^^]#[&]#g;s#\^#\\^#g;s#^#/^#;s#$#$/d#' file1 | sed -f- file2
Comment ça marche:
La première sed
produit une sortie comme celle-ci:
/^[d][s][f]$/d
/^[s][d][f][s][d]$/d
/^[d][s][f][s][d][f]$/d
Ensuite, il est utilisé comme script sed
par la seconde sed
.