J'ai un fichier comme ci-dessous ..
abc, 12345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 56345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 15475
def, text and nos
ghi, something else
jkl, words and numbers
abc, 123345
def, text and nos
ghi, something else
jkl, words and numbers
Je veux le convertir (joindre) en:
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos,text and nos,text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers
text-processing
command-line
awk
join
merge
pvkbhat
la source
la source
Réponses:
Si cela ne vous dérange pas l'ordre de sortie:
Explication
NF>1
ce qui signifie que nous devons uniquement traiter la ligne qui n'est pas vide.a
, avec la clé est le premier champ, la valeur est le deuxième champ (ou le reste de la ligne). Si la clé a déjà une valeur, nous concatérons deux valeurs.END
bloc, nous parcourons le tableau associatifa
, imprimons toutes ses clés avec la valeur correspondante.Ou en utilisant
perl
, la commande sera conservée:la source
perl -F, -lane 'next unless /./;push @{$k{$F[0]}}, ",@F[1..$#F]"; END{print "$_@{$k{$_}}" foreach keys(%k)}' file
:) Les grands esprits se ressemblent!Oh, c'est facile. Voici une version simple qui conserve l'ordre des clés telles qu'elles apparaissent dans le fichier:
La sortie devrait ressembler à ceci:
Si cela ne vous dérange pas d'avoir une ligne vierge supplémentaire à la fin, remplacez simplement la
printf
ligne parprintf("%s %s\n\n", Key[j], Val[Key[j]]);
la source