Depuis quelques années, j'ai souvent besoin de combiner des lignes de texte (triées) avec un premier champ correspondant, et je n'ai jamais trouvé de manière élégante (par exemple un ligne de ligne de commande) fais le. Ce que je veux est similaire à ce qui est possible avec la commande unix join
, mais join
attend 2 fichiers, avec chaque clé apparaissant au maximum une fois. Je veux commencer avec un seul fichier, dans lequel une clé peut apparaître plusieurs tuiles.Combiner des lignes avec le premier champ correspondant
J'ai à la fois un script ruby et perl qui le font, mais il n'y a aucun moyen de raccourcir mon algorithme dans un one-liner. Après des années d'utilisation d'unix, je suis toujours en train d'apprendre de nouveaux trucs avec comm
, paste
, uniq
, etc, et je soupçonne qu'il y a une façon intelligente de le faire.
Il existe quelques questions connexes, comme join all lines that have the same first column to the same line; Command line to match lines with matching first field (sed, awk, etc.); et Combine lines with matching keys - mais ces solutions ne donnent jamais vraiment une solution propre et fiable.
est ici entrée échantillon:
apple:A fruit
apple:Type of: pie
banana:tropical fruit
cherry:small burgundy fruit
cherry:1 for me to eat
cherry:bright red
Voici un exemple de sortie:
apple:A fruit;Type of: pie
banana:tropical fruit
cherry:small burgundy fruit;1 for me to eat;bright red
Voici ma syntaxe idéale:
merge --inputDelimiter=":" --outputDelimiter=";" --matchfield=1 infile.txt
Le "champcorrespondant" est vraiment en option. Cela pourrait toujours être le premier champ. Les apparences suivantes du délimiteur doivent être traitées comme du texte brut.
Cela ne me dérange pas un perl, ruby, awk one-liner, si vous pouvez penser à un algorithme court et élégant. Cela devrait être capable de gérer des millions de lignes d'entrée. Des idées?
Merci @RomanPerekhrest, cela fonctionne. Mieux que d'autres solutions awk que j'ai essayées dans le passé et qui se briseraient sur des lignes complexes. Cela dit, j'aimerais toujours une commande plus courte avec une syntaxe plus simple, mais je suis heureux d'avoir un one-liner. – MichaelD