Vous pouvez le faire avec sed, oui, mais d'autres outils sont plus simples. Par exemple:
$ awk '{
printf "%s ", $2;
for(i=3;i<=NF;i++){
printf "%s:%s:1 ",$1,$(i)
}
print ""
}' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Explication
awk partagera chaque ligne d'entrée sur les espaces (par défaut), l' enregistrement de chaque champs $1
, $2
, $N
. Donc:
printf "%s ", $2;
imprimera le 2ème champ et un espace de fin.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }
: itérera sur les champs 3 jusqu'au dernier champ ( NF
est le nombre de champs) et pour chacun d'eux il imprimera le 1er champ, a :
, puis le champ actuel et a :1
.
print ""
: ceci imprime juste une nouvelle ligne finale.
Ou Perl:
$ perl -ane 'print "$F[1] "; print "$F[0]:$_:1 " for @F[2..$#F]; print "\n"' file
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1
Explication
Les -a
marques perl
se comportent comme awk
et divisent leur entrée sur les espaces. Ici, les champs sont stockés dans le tableau @F
, ce qui signifie que le 1er champ sera $F[0]
, le 2ème $F[1]
etc. Donc:
print "$F[1] "
: imprime le 2ème champ.
print "$F[0]:$_:1 " for @F[2..$#F];
: itérer sur les champs 3 jusqu'au dernier champ ( $#F
est le nombre d'éléments dans le tableau @F
, donc @F[2..$#F]
prend une tranche de tableau commençant au 3e élément jusqu'à la fin du tableau) et imprime le 1er champ, a :
, puis le champ actuel et a :1
.
print "\n"
: ceci imprime juste une nouvelle ligne finale.
Avec awk:
ou avec bash:
Production:
la source
Eh bien, vous pouvez le faire dans sed, mais python fonctionne aussi.
Le contenu du
reformatfile.py
sont les suivants:Comment cela marche-t-il? Il n'y a vraiment rien de particulièrement spécial. Nous ouvrons le premier argument de ligne de commande en tant que fichier à lire et procédons à la décomposition de chaque ligne en "mots" ou éléments individuels. Les premiers mots deviennent
pref
variables, et nous imprimons sur le second élément (mots [1]) standard se terminant par un espace. Ensuite, nous construisons un nouvel ensemble de «mots» via des listes de compréhension et.join()
fonctionnons sur une liste temporaire de pref, chaque mot et chaîne"1"
. La dernière étape consiste à les imprimerla source
Avec
awk
:Il s'agit de formater des champs séparés par des espaces au format souhaité:
printf("%s ", $2)
imprime le deuxième champ avec un espace de finfor(i=3; i<NF; i++) printf("%s:%s:1 ", $1, $i)
itère sur le 3ème à l'avant-dernier champs et imprime les champs au format souhaité (premier champ, puis deux points, puis le champ courant, puis deux points, enfin 1) avec un espace de finprintf("%s:%s:1\n", $1, $NF)
imprime le dernier champ avec la nouvelle ligneExemple:
la source