2012-04-16 3 views
1

У меня есть большой табуляцией текстового файла два столбца, например:AWK декартово произведение

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

Как вы видите, второй столбец не содержит атомарные значения. Вот почему я хочу, чтобы «нормализовать» этот файл, чтобы иметь что-то вроде:

... 
"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" 
... 

Любой знает, как сделать это эффективно?

ответ

1

Perl:

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

В моем случае это был самый быстрый среди всех предоставленных решений, и один из (только) двух фактически работающих ... – mnowotka

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

Для каждого поля после $1, полоса кавычек и двоеточия, а затем распечатать $1 сопровождаемую содержимое поля, окруженного кавычками. Сделайте это для каждой строки входного файла.

+0

Не работает для меня. Даже не снимайте qoutes. – mnowotka

+0

@mnowotka: желаемый результат, который вы показываете в своем вопросе, включает в себя кавычки вокруг каждого элемента данных. Мой сценарий разбивает кавычки и добавляет их обратно, чтобы дать результат по запросу и как я описал в своем ответе. Как именно это не работает для вас? –

0

Это может работать для вас (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" 

или, это не AWK, но элегантно решает эту проблему.

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" 
Смежные вопросы