0

私が抱えていた問題を解決するために SO の誰かが親切に提供してくれたスクリプトがありますが、OSX で動作させるにはいくつか問題があります。

gawk --version
GNU Awk 3.1.6

awk --version
awk version 20100208

元のソースは次のとおりです。

awk -F, -vOFS=, -vc=1 '
NR == 1 {
    for (i=1; i<NF; i++) {
        if ($i != "") {
            g[c]=i;
            f[c++]=$i
        }
    }
}
NR>2 {
    for (i=1; i < c; i++) {
        print $1,$2, $g[i] > "output_"f[i]".csv
    }
}' data.csv

スクリプトを実行すると、次のエラーが発生します。

awk: syntax error at source line 12
context is print $1,$2, $g[i] > >>>  "output_"f <<< [i]".csv
awk: illegal statement at source line 13

見たところ、[i] の変数は出力ファイルに修正されていませんが、その理由はわかりません。

AWK を GAWK に変更して元のスクリプトを実行すると、出力は次のようになります。

gawk: cmd. line:11:             print $1,$2, $g[i] > "output_"f[i]".csv
gawk: cmd. line:11:                                               ^ unterminated string

したがって、関連する行を編集して、未終了の文字列を修正します

print $1,$2, $g[i] > "output_"f[i]".csv"

その後、問題なく実行され、エラーは発生しませんが、出力ファイルはありません。

何か案は?私は昨夜と今朝の大部分をこれに注ぎました。

サンプル入力ファイル:

,,L1,,,L2,,,L3,,,L4,,,L5,,,L6,,,L7,,,L8,,,L9,,,L10,,,L11,
Title,r/t,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,neede d,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst,needed,actual,Inst
EXAMPLEfoo,60,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
EXAMPLEbar,30,6,6,12,6,7,14,6,6,12,6,6,12,6,8,16,6,7,14,6,7.5,15,6,6,12,6,8,16,6,0,0,6,7,14
EXAMPLE1,60,3,3,3,3,5,5,3,4,4,3,3,3,3,6,6,3,4,4,3,3,3,3,4,4,3,8,8,3,0,0,3,4,4
EXAMPLE2,120,6,6,3,0,0,0,6,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
EXAMPLE3,60,6,6,6,6,8,8,6,6,6,6,6,6,0,0,0,0,0,0,6,8,8,6,6,6,0,0,0,0,0,0,0,10,10
EXAMPLE4,30,6,6,12,6,7,14,6,6,12,6,6,12,3,5.5,11,6,7.5,15,6,6,12,6,0,0,6,9,18,6,0,0,6,6.5,13

そして、出力例は次のようになります

したがって、L1 の出力例は次のようになります。

EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6

L2 の場合:

EXAMPLEfoo,60,0
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,0
EXAMPLE3,60,6
EXAMPLE4,30,6
4

1 に答える 1

1

2 つの問題があります (OS X プラットフォームの場合):

  1. OS X の awk コマンドは -v フラグをサポートしていません。BEGIN パターンを使用して修正できます。
  2. OS X の awk は、print 行で出力ファイルを作成する方法が好きではありません。

これが私の解決策で、Mac OS X Snow Leopard と Red Hat Linux 4.x の両方で動作するようです:

awk -F, '
BEGIN { OFS=","; c=1 } # FIX problem 1
NR == 1 {
    for (i=1; i<NF; i++) {
        if ($i != "") {
            g[c]=i;
            f[c++]=$i
        }
    }
}
NR>2 {
    for (i=1; i < c; i++) {
        outfile=sprintf("output_%s.csv", f[i]) # FIX problem 2
        print $1,$2, $g[i] > outfile
    }
}' data.csv
于 2010-04-14T23:53:46.797 に答える