trouver des doublons dans un champ et les imprimer dans unix bash

J’ai un fichier le contient

apple apple banana orange apple orange 

Je veux un script qui trouve les doublons Apple et Orange et indique à l’utilisateur que: Apple et Orange sont répétés. j’ai essayé

 nawk '!x[$1]++' FS="," filename 

pour trouver des éléments répétés, comment puis-je les imprimer dans unix bash?

Pour imprimer les lignes en double, vous pouvez dire:

 $ sort filename | uniq -d apple orange 

Si vous souhaitez également imprimer le compte, fournissez l’option -c à uniq :

 $ sort filename | uniq -dc 3 apple 2 orange 

+1 pour la réponse de devnul . Toutefois, si le fichier contient des espaces au lieu de nouvelles lignes en tant que délimiteur. alors ce qui suit fonctionnerait.

 tr [:blank:] "\n" < filename | sort | uniq -d 

Mettre à jour:

La question a été considérablement modifiée. Auparavant, lorsque vous répondiez à cela, le fichier d’entrée devrait ressembler à:

 apple apple banana orange apple orange banana orange apple ... 

Cependant, la solution fonctionnera de toute façon, mais pourrait être un peu trop compliquée pour ce cas particulier.


Le script awk suivant fera le travail:

 awk '{i=1;while(i <= NF){a[$(i++)]++}}END{for(i in a){if(a[i]>1){print i,a[i]}}}' your.file 

Sortie:

 apple 3 orange 2 

C’est plus compréhensible sous une forme comme celle-ci:

 #!/usr/bin/awk { i=1; # iterate through every field while(i <= NF) { a[$(i++)]++; # count occurrences of every field } } # after all input lines have been read ... END { for(i in a) { # ... print those fields which occurred more than 1 time if(a[i] > 1) { print i,a[i]; } } } 

Ensuite, rendez le fichier exécutable et exécutez-le en lui passant le nom du fichier d’entrée:

 chmod +x script.awk ./script.awk your.file