2016-01-28 1 views
0
CSV

Quelle est la différence entre:Les différences entre les commandes Unix pour le tri

!tail -n +2 hits.csv | sort -k 1n -o output.csv 

et

!tail -n +2 hits.csv | sort -t "," -k1 -n -k2 > output.csv 

? J'essaie de trier un fichier csv par la première colonne d'abord, puis par la deuxième colonne, de sorte que les lignes avec la même première colonne sont toujours ensemble.

Il semble que le premier le fasse déjà correctement, en triant d'abord par le champ avant la première virgule, puis par le champ suivant la première virgule. (rupture de liens, c'est.)

Ou ne fait-il pas réellement cela?

Et que fait la deuxième commande? (Et quelle est la différence entre les deux?) Il y a une différence significative entre les deux fichiers output.csv lorsque je cours les deux.

Et, finalement, lequel dois-je utiliser? (Ou sont-ils tous les deux faux?)

Répondre

1

Se e aussi la réponse par @morido pour d'autres pointeurs, mais voici une description de exactement ce que ces deux sort invocations font:

sort -k 1n -o output.csv 

Cela suppose que les « champs » dans votre fichier sont délimités par une transition de non espace blanc à l'espace (c.-à-d. les blancs sont inclus dans chaque champ, non supprimés, comme beaucoup peuvent s'attendre/supposer), et dit sort pour ordonner les choses par une clé qui commence par le premier champ et s'étend jusqu'à la fin de la ligne, et suppose que la clé est formatée comme une valeur numérique. La sortie est envoyée explicitement à un fichier spécifique.

sort -t "," -k1 -n -k2 

Ceci définit le séparateur de champs comme une virgule, puis définit deux clés à trier. La première clé recommence au premier champ et s'étend jusqu'à la fin de la ligne et est lexicographique (ordre du dictionnaire), non numérique, et la seconde clé, qui sera utilisée lorsque les valeurs de la première clé sont identiques, commence par la seconde. champ et s'étend à la fin de la ligne, et en raison de l'intervenant -n, sera également supposé être des données numériques.Cependant, parce que votre première clé implique la ligne entière, essentiellement, la deuxième clé ne sera probablement jamais nécessaire (si la première clé de deux lignes séparées est identique, la deuxième clé le sera probablement aussi).

Puisque vous n'avez pas fourni des données d'échantillon, on ne sait pas si les données contenues dans les deux premiers champs est numérique ou non, mais je suppose que vous voulez quelque chose comme ce qui a été suggéré dans la réponse par @morido:

sort -t, -k1,1 -k2,2 

ou

sort -t, -k1,1n -k2,2n   (alternatively sort -t, -n -k1,1 -k2,2) 

si les données est numérique.

+0

Ceci est mon hits.csv: –

+0

ip, timestamp 62.172.72.131,1041502001 62.172.72.131,1041502098 62.121.107.115,1041809792 163.28.16.1,1043258352 216.37.59.126,1044304131 68.104.188.224,1044472900 66.137.118.69,1044543502 207.181.42.20,1044646708 205.156.184.254,1045670100 80.225.248.61,1045779615 200.44.24.157,1046214366 193.63.247.68,1046260886 66.176.248.72,1046317786 216.249.85.109,1046566502 68,44 .222.12,1046638290 130.113 .69.66,1048009156 –

+0

Alors, quelle serait la bonne façon de faire cela? –

1

Tout d'abord: vous voulez supprimer le ! de ces deux commandes. Dans Bash (et probablement d'autres puisque cela vient de csh), vous faites référence à la dernière commande qui contenait tail dans votre historique, ce qui n'a pas de sens ici. La principale différence entre vos deux versions est que dans le premier cas, vous ne prenez pas en compte la deuxième colonne.

Voilà comment je le ferais:

tail -n +2 hits.csv | sort -t "," -n --key=1,1 --key=2,2 > output.csv 
  • -t spécifie le séparateur de champ
  • -n tours sur ordre de tri numérique
  • --key spécifie les champs qui doivent être utilisés pour le tri (en ordre de préséance)
+0

Merci. @morrido –