2017-10-04 1 views
0

J'ai trouvé comment faire ça avec awk, mais j'aimerais trouver un moyen de le faire avec sed aussi. Ce que j'ai vu sur StackOverflow utilise awk ou est extrêmement énigmatique, ne fonctionne pas, et n'offre aucune explication pour m'aider à le faire fonctionner. J'ai entrée comme ceci:Rejoindre des lignes avec un champ commun spécifiquement avec sed?

Hello1 aaa

Hello2 de

Hello1 CCSC

Hello1 ddd

Et besoin d'une sortie comme ceci:

Hello1 aaa, ccc, ddd

Hello2 bbb

Si vous pouvez expliquer la commande, ce serait fantastique. J'ai essayé de lire sur sed mais c'est encore très déroutant.

Répondre

0

Ce que j'ai vu sur StackOverflow utilise soit awk ou est extrêmement cryptique, ne fonctionne pas, et ne propose aucune explication pour me aider faire fonctionner.

Si vous pouvez expliquer la commande, ce serait fantastique. J'ai essayé en lisant sur sed mais c'est encore très confus.

awk '{arr[$1] = ($1 in arr ? arr[$1] "," : "") $2 }END{ for(i in arr)print i,arr[i] }' infile 

Explication:

awk '{ 
     # arr is array, index being first field 
     # if array arr has key before ($1 in arr), then 
     # arr[$1] contains previously stored value arr[$1] plus comma 
     # and send field of line read 
     # otherwise, just second field of line read 

     arr[$1] = ($1 in arr ? arr[$1] "," : "") $2 
     } 
    END{ 
     # loop through array arr 
     # print array key and value 
     for(i in arr)print i,arr[i] 
     } 
    ' infile 

Résultats des tests:

$ cat infile 
Hello1 aaa 
Hello2 bbb 
Hello1 ccc 
Hello1 ddd 

$ awk '{arr[$1] = ($1 in arr ? arr[$1] "," : "") $2 }END{ for(i in arr)print i,arr[i] }' infile 
Hello1 aaa,ccc,ddd 
Hello2 bbb 
+0

Je sais comment faire cela avec awk, je demandais une commande équivalente dans sed. – Ashley

+0

@Ashley: Désolé peut-être que j'ai mal lu, je vous ai dit AFAIK aussi des explications –

+0

@Ashley ce serait bien, si vous pouvez montrer votre expérience sed aussi, je suis personnellement intéressé de savoir comment cela peut être fait –

1

Cela pourrait fonctionner pour vous (GNU sed):

sed -r '1h;1d;H;x;s/((\S+) \S+)(.*)\n\2 (\S+)$/\1,\4\3/;x;$!d;x' file 

Enregistrez la première ligne dans l'espace de stockage (HS), puis supprimez-la. Pour les lignes suivantes, ajoutez la ligne courante au HS et, après l'échange avec le HS, faites correspondre les valeurs similaires et remplacez les valeurs (si réussies) au format requis. Revenez toujours à l'espace de configuration (PS), puis supprimez le PS. Enfin, s'il s'agit de la dernière ligne de permutation vers le HS et imprimez-le contenu.