2012-04-16 6 views
1

私はこのように、大規模なタブ区切り2列のテキストファイルを持っている: awkのデカルト積

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

誰もが効果的にそれを行う方法を知っている:私はのようなものを持っているために、このファイルを「正常化」したい理由ですか?その後、

$1後の各フィールドについては

答えて

1

たPerl:

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

私の場合、これはすべての提供されたソリューションの中で最も速く、(実際に働いている2つの) – mnowotka

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

、ストリップ引用符やセミコロン、引用符で囲まれたフィールドの内容が続く$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" 
関連する問題