2012-04-16 2 views
1

J'ai un grand fichier texte à deux colonnes séparées par des tabulations, comme ceci:awk produit cartésien

... 
"001R_FRG3G" "81941549; 47060116; 49237298" 
"002L_FRG3G" "49237299; 47060117; 81941548" 
"002R_IIV3" "106073503; 123808694; 109287880" 
... 

Comme vous le voyez deuxième colonne ne contient pas de valeurs atomiques. Voilà pourquoi je veux « normaliser » ce fichier pour avoir quelque chose comme:

... 
"001R_FRG3G" "81941549" 
"001R_FRG3G" "47060116" 
"001R_FRG3G" "49237298" 
"002L_FRG3G" "49237299" 
"002L_FRG3G" "47060117" 
"002L_FRG3G" "81941548" 
"002R_IIV3" "106073503" 
"002R_IIV3" "123808694" 
"002R_IIV3" "109287880" 
... 

Tout le monde sait comment le faire efficacement?

Répondre

1

Perl:

perl -lne ' 
s/[";]//g; 
($a, @b) = split; 
print qq("$a" "$_") for @b; 
' FILE 
+0

Dans mon cas c'était le plus rapide parmi toutes les solutions fournies et l'un des deux (seulement) deux fonctionnait réellement ... – mnowotka

1
awk '{for (i=2; i<=NF; i++) {gsub(/[";]/, "", $i); printf "%s%s\"%s\"", $1, OFS, $i; printf "%s", "\n"}}' inputfile 

Pour chaque champ après $1, entre guillemets de bande et des points-virgules, puis imprimez $1 suivi par le contenu du champ entouré par des guillemets. Faites ceci pour chaque ligne dans le fichier d'entrée.

+0

ne fonctionne pas pour moi. Même ne dépouillez pas qoutes. – mnowotka

+0

@mnowotka: La sortie désirée que vous montrez dans votre question inclut des guillemets autour de chaque élément de données. Mon script dépouille les citations et les ajoute pour donner la sortie comme demandé et comme je l'ai décrit dans ma réponse. Comment cela ne fonctionne-t-il pas exactement pour vous? –

0

Cela pourrait fonctionner pour vous (GNU awk):

awk '{while(/;/) $0=gensub(/^((.*[ \t]").*);[ \t]*/,"\\1\"\n\\2",1)};1' file 
"001R_FRG3G" "81941549" 
"001R_FRG3G" "47060116" 
"001R_FRG3G" "49237298" 
"002L_FRG3G" "49237299" 
"002L_FRG3G" "47060117" 
"002L_FRG3G" "81941548" 
"002R_IIV3" "106073503" 
"002R_IIV3" "123808694" 
"002R_IIV3" "109287880" 

ou, ce n'est pas awk mais il résout le problème avec élégance.

sed -i ':a;s/\(\(.*\s"\).*\);\s*/\1"\n\2/;ta' file 
"001R_FRG3G" "81941549" 
"001R_FRG3G" "47060116" 
"001R_FRG3G" "49237298" 
"002L_FRG3G" "49237299" 
"002L_FRG3G" "47060117" 
"002L_FRG3G" "81941548" 
"002R_IIV3" "106073503" 
"002R_IIV3" "123808694" 
"002R_IIV3" "109287880" 
Questions connexes