我有大的制表符分隔的双列文本文件,如下所示:
...
"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"
...
任何人都知道如何有效地做到这一点?
答案 0 :(得分:1)
awk '{for (i=2; i<=NF; i++) {gsub(/[";]/, "", $i); printf "%s%s\"%s\"", $1, OFS, $i; printf "%s", "\n"}}' inputfile
对于$1
之后的每个字段,引用引号和分号,然后打印$1
,后跟引号括起的字段内容。对输入文件中的每一行执行此操作。
答案 1 :(得分:1)
的Perl:
perl -lne '
s/[";]//g;
($a, @b) = split;
print qq("$a" "$_") for @b;
' FILE
答案 2 :(得分: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"