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"
...
Кто-нибудь знает, как это сделать эффективно?
3 ответа
Решение
Perl:
perl -lne '
s/[";]//g;
($a, @b) = split;
print qq("$a" "$_") for @b;
' FILE
awk '{for (i=2; i<=NF; i++) {gsub(/[";]/, "", $i); printf "%s%s\"%s\"", $1, OFS, $i; printf "%s", "\n"}}' inputfile
Для каждого поля после $1
, разделите кавычки и точки с запятой, затем напечатайте $1
с последующим содержимым поля в кавычках. Сделайте это для каждой строки во входном файле.
Это может работать для вас (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"