2017-10-11 11 views
-6

Je souhaite comparer les nombres de lignes de deux fichiers distincts. Alors que j'ai essayé d'utiliser wc -l dans la comparaison, j'ai du mal à le faire fonctionner correctement.Comment comparer le nombre de lignes dans 2 fichiers à l'aide de la commande IF/Then Bash

J'ai:

if [ "$(wc -l file1.txt)" == "$(wc -l file2.txt)" ]; then echo "Warning: No Match!"; fi 

Cependant, l'if/then instruction ne renvoie pas la sortie correcte.

Si les fichiers 1 et 2 ont le même nombre de lignes, quelle est la bonne façon d'écrire ce code?

Fichier1.txt:

example1 
example2 
example3 

FILE2.TXT:

example4 
example5 
example6 

Mise à jour: Nous avons constaté que la commande wc -l doit retourner un chiffre que pour la comparaison. Contrairement à la question Why should there be a space after '[' and before ']' in Bash?, cette question nécessite d'utiliser wc -l pour obtenir un entier qui peut être comparé au nombre de lignes dans des fichiers séparés.

Répondre

2

Pourriez-vous s'il vous plaît essayer de suivre et laissez-moi savoir si cela vous aide.

if [ "$(wc -l < file1.txt)" -eq "$(wc -l < file2.txt)" ]; then echo 'Match!'; else echo 'Warning: No Match!'; fi 

Exemples code ci-dessus: Disons que nous avons Input_files suivants:

cat file1.txt 
I 
am 
Cookie 

cat file2.txt 

I 
am 
Cookie 

Maintenant, puisque nous avons pu voir le nombre de lignes ne sont pas égaux dans les deux fichiers pour résultat suivant viendra.

if [ "$(wc -l < file1.txt)" -eq "$(wc -l < file2.txt)" ]; then echo 'Match!'; else echo 'Warning: No Match!'; fi 
Warning: No Match! 

Maintenant, si les deux lignes du fichier sont égales maintenant, comme suit.

cat file1.txt 
I 
am 
Cookie 
cat file2.txt 
I 
am 
Cookie 

Maintenant, quand nous exécutons le même code, il va donner comme suit.

if [ "$(wc -l < file1.txt)" -eq "$(wc -l < file2.txt)" ]; then echo 'Match!'; else echo 'Warning: No Match!'; fi 
Match! 
+0

Cela fonctionne pour moi Ravinder. Merci. – DomainsFeatured

+0

@down électeur: S'il vous plaît faites-moi savoir la raison du vote en bas, afin que je puisse m'améliorer. – RavinderSingh13

+1

Je ne suis pas le downvoter, mais l'exécution de deux substitutions de commande et la comparaison de leur sortie est une odeur de code. J'essaierais de le refactoriser en un flux plus idiomatique, peut-être avec un seul 'wc' ou un script Awk. – tripleee

1

Vous devez avoir un espace entre vos supports et votre expression de comparaison:

if [ <expression> ]; then echo "Then Do Something"; fi 

Donc, dans votre cas, il serait:

if [ "$(wc -l file1.txt)" -eq "$(wc -l file2.txt)" ]; then echo "Warning: No Match!"; fi 
+0

Cela donnera une erreur puisque '!' Est présent dans l'écho avec "et il a une signification spéciale, quand vous changez" "' '' '' 'alors ça devrait être bon. – RavinderSingh13

+0

ah merci pour la clarification! – hackerrdave

+0

Cette réponse ne fonctionne pas car 'wc -l file1.txt' ne retourne pas un entier. – DomainsFeatured