Votre question a été taguée avec différents langages utilitaires/colles, y compris Perl, donc cette réponse décrit des solutions utilisant le langage de programmation Perl.
Voici un Perl solution one-liner:
perl -lF/\\t/ -e 'print "$F[0] $_" for split /,/, $F[1]' test.txt
Suivant un fichier délimité par des tabulations comme décrit dans la question ce produit la sortie suivante:
ID1 blue
ID2 yellow
ID2 blue
ID3 green
ID3 yellow
ID3 red
ID4 red
1D5 red
1D5 purple
Cela fonctionne à peu près la même que le suivant script Perl complet:
while (<>) {
chomp;
next unless length;
my ($id, $colors) = split /\t/, $_;
print "$id $_\n" foreach split /,/, $colors;
}
Dans ces solutions, j'ai utilisé \t
pour séparer les onglets, bien que les données d'exemple que vous avez fournies semblaient plutôt être délimitées par des espaces, et non par des tabulations. Si c'est le cas que vos données sont simplement délimitées par des espaces, remplacez \t
par \s+
.
Voilà comment celui-liner fonctionne:
-l
ensembles auto-Chomp pour l'entrée, et l'auto-retour à la ligne pour la sortie. Le commutateur -F
définit implicitement -a
(ce qui signifie auto-split en @F
) et -n
(ce qui signifie parcourir les fichiers d'entrée transmis sur la ligne de commande).
Le -F/\\t/
signifie la division automatique sur l'expression rationnelle /\t/
, ou en d'autres termes, sur les caractères de tabulation, remplissant @F
avec les résultats. (Vous pouvez changer \\t
-\\s+
si vos données sont plus généralement des espaces délimités.)
Par conséquent, pour chaque ligne d'entrée, $F[0]
contiendra le champ IDx
et $F[1]
contiendra des couleurs telles que yellow,blue
.
Le commutateur de ligne de commande -e
moyen d'évaluer le code suivant, et parce que nous avons -n
implicite dans -F
nous itérer sur le fichier et exécuter le code une fois par ligne des fichiers d'entrée.
Et le code que nous passons est:
print "$F[0] $_" foreach split /,/, $F[1]
Ce qui signifie que chaque ligne du fichier, pour chaque élément dans la liste des couleurs, imprimer l'ID (stocké dans $F[0]
), suivi par la couleur (stockée au $_
).
on dérive les couleurs individuellement en divisant $F[1]
, qui peut contenir yellow,blue
sur la virgule, et le remplissage $_
pour chaque couleur (en utilisant la boucle foreach
).
décrivant la version du script:
while(<>) {...}
lit une ligne à la fois des fichiers définis sur la ligne de commande (ou de STDIN), et pour chaque ligne Remplit $_
.
Documentation pertinente:
Chaque installation complète de navires Perl avec la commande perldoc
, qui peut être appelé avec le nom d'un morceau de la documentation de Perl pour lire.
Voir les éléments suivants:
perldoc perlrun
- Une explication des commutateurs de ligne de commande de Perl.
perldoc perlintro
- Une brève introduction à Perl.
perldoc perlre
- Présentation générale des expressions régulières de Perl.
perldoc -f split
- Une explication du fonctionnement de la fonction split
de Perl.
perldoc perlsyn
- Une description des structures de contrôle de Perl telles que les boucles foreach
.
perldoc perlop
- Une vue d'ensemble des opérateurs de Perl, y compris <>
.
De plus, si vos données est plus complexe que montré, en utilisant des constructions telles que guillemets et les échappements de délimiteurs, vous devriez probablement préférez le module Text::CSV
CPAN pour analyser le fichier TSV/CSV.
Merci beaucoup, Ed! – Cath