1

次のような、タブで区切られた2列の大きなテキストファイルがあります。

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

ご覧のとおり、2番目の列にはアトミック値が含まれていません。そのため、このファイルを次のように「正規化」したいと思います。

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

誰もがそれを効果的に行う方法を知っていますか?

4

3 に答える 3

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

後の各フィールドについて$1、引用符とセミコロンを削除してから、引用符$1で囲まれたフィールドの内容を印刷してから続けます。入力ファイルの各行に対してこれを実行します。

于 2012-04-16T21:08:22.527 に答える
1

Perl:

perl -lne '
s/[";]//g;
($a, @b) = split;
print qq("$a" "$_") for @b;
' FILE
于 2012-04-17T07:05:28.867 に答える
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"
于 2012-04-17T06:53:04.367 に答える