2010-11-22 2 views
2

S'il vous plaît jeter un oeil sur les points suivants tout ce que je veux est d'obtenir la chaîne de node_name à partir du fichier et effectuer uniq pour obtenir des chaînes uniq si elles sont égalesuniq + reçoivent pas les chaînes uniq à partir du fichier

mais l'exemple suivant J'ai deux lignes égales (node_name moon1)

mais pourquoi la commande uniq ne la diminue pas à une ligne ??? , Je ne comprends vraiment pas pourquoi?

sed s'/=/ /'g file| awk -v WORD=node_name '$2 == WORD {print $0}' | awk '{print $2" "$3}' | sort | uniq 

node_name moon1 
node_name moon1 

le fichier:

. 
    . 

/home/home1/home2/config1/COMPANY/my.config  node_name=moon1 
/home/home1/home2/config1/MEAS2XML/my.config.tmp node_name=moon1 

    . 
    . 
+1

fonctionne bien pour moi 'x [0] $ ++!: Http://www.ideone.com/ HYkDH – codaddict

+0

le fichier a plus de 1000 lignes les deux lignes font partie du gros fichier – jon

+0

salut je trouve^M après moon1 - s'il vous plaît des conseils comment supprimer ce – jon

Répondre

5

Il y a deux causes principales uniq défaut de fusion des lignes identiques:

  • Les lignes ne sont pas vraiment identiques - extra est un espace de fin usual suspect ici. Les commandes awk devraient filtrer celles de cet exemple, mais vous pouvez le vérifier quand même. Les terminaisons de ligne mélangées sont également une cause possible.

  • Les lignes ne sont pas adjacentes - peuvent trier et échoueront à trier les lignes "correctement" si les paramètres régionaux sont incorrects. I ont vu des cas bizarres avec du texte non-ASCII où les lignes identiques ne finiront pas l'une après l'autre. Vérifiez la sortie de tri, avant la commande uniq. Quels sont vos paramètres régionaux?

BTW, 'sort -u' est une meilleure alternative pour 'tri | uniq '.

EDIT:

On dirait que l'un ou l'autre de ces questions:

  • Vous avez ligne terminateurs mixtes. Si certaines de vos lignes se retrouvent dans LF (\ n, terminaisons de style Unix) et d'autres dans CR/LF (\ r \ n, terminateurs de type DOS), uniq les traitera comme des lignes différentes, même si elles sont identiques.

  • Espace de fin de ligne dans certaines de vos lignes avec les terminaisons de ligne CR/LF DOS. Le caractère CR (Carriage return, '\ r') n'est pas considéré comme un espace par la plupart des utilitaires UNIX, y compris awk. Si l'une de vos lignes n'a aucun autre espace de fin, le CR sera considéré comme faisant partie de son dernier champ et sera imprimé. D'un autre côté, dans une ligne avec des espaces entre le dernier champ et le CR, le dernier champ imprimé par awk ne contiendrait pas le CR.

Modification de la terminaison de ligne CR/LF à LF résoudra les problèmes dans ce cas, mais il est généralement préférable de filtrer fuite des espaces ainsi:

  • dos2unix est le meilleur moyen
  • Comme une alternative, filtrez votre fichier à travers sed 's|\r$||'
+0

merci pays d'espoir viendra aux affaires - :) – jon

1

On dirait que vous avez des caractères parasites dans votre fichier. Nettoyer la première utilisation:

dos2unix your_file 

également, sans rapport avec votre problème, mais vous pouvez remplacer sort | uniq avec simplement sort -u.

+1

Merci beaucoup pour cette réponse. Suppression des espaces, en s'assurant que tous les fichiers étaient en UTF-8, rien ne semblait fonctionner. Je commençais à me tirer les cheveux. 'do2unix' a apporté le salut que je cherchais. – Glutanimate

0

Je n'ai pas essayé la commande que vous avez spécifiée dans votre question, mais j'ai exécuté ce qui suit à la place:

cat foo | cut -d \ = -f 2 | sort | uniq

où "foo" est un fichier contenant les 2 lignes dans votre exemple. La sortie de ce qui précède est "moon1".

Plus simple que votre exemple car je suppose qu'il n'y a qu'une seule paire 'nom = valeur' ​​par ligne; Je ne sais rien de votre format de fichier.

Hope this helps quand même ...

+0

Votre oneliner peut être plus court, mais il traite différemment les espaces de fin aux commandes awk de l'OP. – thkala

0

Je traversais un problème similaire, mais en plus de supprimer les lignes en double, je voulais vous assurer que l'ordre des lignes est également maintenue. Combiner uniq et tri défait ce but.

Heureusement awk fournit la solution

de $ awk NomFichier.txt

awk and duplicate lines

Questions connexes