J'analyse une table wikipedia. Le tableau contient les données suivantes
, Trinidad and Tobago , , , Tunisia , , , Turkey , 14.5 26.5
Je voudrais avoir une expression régulière (exécutable dans le terminal, de préférence sed ou similaire) qui déplace un nombre arbitraire de N lignes de nombres vers le nom de pays AZ ci-dessus
Le résultat attendu est:
Tonga,0 Trinidad and Tobago,10,14,24 Tunisia,10,6,16 Turkey,12,26.5
Je ne me suis pas rapproché, voici mes meilleurs efforts. Votre wisdown est apprécié
perl -pe 's / ^ [0-9] * $ / \ n, / g'
Produit p >
Tonga 0 Trinidad and Tobago 10 14 24 Tunisia 10 6 16 Turkey 12 14.5 26.5
Ceci est incorrect car je remplace PAR \ n
et je dois remplacer \ n
PAR autre chose. Malheureusement, je ne sais pas s'il est possible de faire correspondre \ n
avec sed / perl
J'ai essayé tr
, mais encore une fois, je ne sais pas comment pour maintenir mon match sur la sortie. Il remplace tous les caractères par
tr 'A-z \ n' ','
Produit
, 0 , , , 10,14,24 , 10,6,16 , , 12,14.5,26.5,
5 Réponses :
Pourriez-vous essayer de suivre.
awk ' BEGIN{ ##Starting BEGIN section here. OFS="," ##Setting output field seprator as comma here. } /^[a-zA-Z]+/ && val{ ##Checking condition if a line starts with alphabet and variable val is not null. print val ##Printing variable val here. val="" } { val=(val?val OFS:"")$0 ##Creating variable val and concatenating its value to its own for each line value. } END{ ##Starting END block for this awk code. if(val){ ##Checking if val is NOT NULL. print val ##Then printing val here. } }' Input_file ##Mentioning Input_file name here.
Explication:
awk 'BEGIN{OFS=","}/^[a-zA-Z]+/ && val{print val;val=""} {val=val?val OFS $0:$0} END{if(val){print val}}' Input_file
p>
Cela fonctionne parfaitement, pourriez-vous s'il vous plaît expliquer votre réponse pour moi et la communauté? @ RavinderSingh13
Une autre solution awk
:
awk '/[a-zA-Z]/{if(FNR>1)print "";printf "%s",$0} $0+0==$0{printf ",%s",$0} END{print ""}' file
$ awk '{printf "%s%s", (/^[0-9]/ ? "," : s), $0; s=ORS} END{print ""}' file Tonga,0 Trinidad and Tobago,10,14,24 Tunisia,10,6,16 Turkey,12,14.5,26.5
Et une solution sed
:
sed -n -e '/[a-zA-Z]/{' -e 'x;/./s/\n/,/gp;x;h;}' -e '/^[0-9][0-9.]*$/H;${' -e 'x;/./s/\n/,/gp;}' file
L'idée est d'enregistrer chaque pièce dans l'espace d'attente, puis de la désactiver et de remplacer \ n code > avec
,
s et imprimer.
par perl 5, vos données dans 'table';
$ perl -lpe 'BEGIN{undef $/} s/\n/,/g; s/([a-z ]+(,[\d.]+)*),/$1\n/ig' table
ou
$ perl -lpe 'BEGIN{undef $/} s/\n(?!$)/,/g; s/(?<=\d),([a-z])/\n$1/ig' table
Avez-vous tenté quelque chose?
J'ai essayé de faire correspondre les nombres entiers et de remplacer
\ n
par,
mais ma solution est très incorrecte. J'ai également essayé une approche similaire avec perl en vain ...@Goldfish Montrez votre code que vous avez essayé dans votre question s'il vous plaît. Consultez l ' exemple minimal reproductible .
@Tiw J'ai mis à jour avec 2 exemples que j'ai essayés, ni correct ni proche de l'OMI
@Goldfish Ce n'est pas grave si ce n'est pas correct, si c'est correct, vous ne demanderez probablement même pas ici. Juste qu'il est important et poli de montrer vos propres efforts ici, sinon cela semble juste une demande de laisser les autres faire votre travail, d'abuser de la bonté des réponses ici.