0

ヘッダー セクション (130 行、1 列) を持つ大きな CSV (約 90 MB) を解析しようとしています。行 131 は、個々の列 (合計 20 列) の名前を持つ列ヘッダーです。

最初の 9 列を解析する必要はありません。列 #10 から列 #20 までのデータは次の形式です (見やすくするために列として再フォーマットされていますが、下の各行は実際には CSV の個々の列にあります)。

0/0: 3,0 :9:0,9,90

./.

0/1: 6,3 :49:73,0,111

0/1: 13,3 :99:103,0,254

0/1: 6,6 :45:56,3,124

0/1: 2,2 :34:43,0,51

0/1: 80,0 :87:252,5,1882

0/1: 25,12 :99:139,286,3281

./.

0/1: 6,8 :64:64,0,130

0/1: 4,5 :65:109,0,114

この「0/0: 3,0 :9:0,9,90」を例にとると、基準は次のとおりです。強調表示されている 2 つの数字 (3,0) の合計が >=20 で、2 番目の数字 (0 ) が 10 以上の場合、それを新しい CSV に出力します。基準を満たさない場合は、「./.」を出力するだけです。新しいCSVで。「./.」を含むセル すでに「./.」のままです。新しいCSVで。

このスレッドでawk を使用して csv (タブ区切り) を 1 行ずつ処理する質問の一部を行いました。Kentのおかげで、条件を単一のセルに適用する方法がわかりましたが、10 をループする必要があります。列と同じ基準を適用します。以下は私が思いついたものですが、明らかに、これを完成させるにはもっと助けが必要です. ヘルプ/提案をいただければ幸いです。

BEGIN {
-F'\t'; -v OFS='\t'

for (i=10; i<=20; i++)   
 {
  t=$i; 
  split(t,a,/[:,]/)}(a[2]+a[3])>=20 && a[3]>=10
  }

}
4

1 に答える 1

2

質問に特定の入力からの出力例が含まれていれば、正確な回答を提供するのに役立ちます。しかし、全体として、あなたはあなたのソリューションに非常に近いです...例外を除いて... (t,a,/[:,]/)}?開始の '{' 文字はどこですか? コード内の と の不均衡が{あり}ます。エラーメッセージが表示されるはずで、どの awk に応じて、解析できないものを示している可能性が高いでしょう。

BEGIN { -F"\t"; OFS="\t" }
# -----------missing ----^--
# awk doesn't like '\t' quoting, use "\t"
# the -v is only for the command line, not in a BEGIN block

# awk executes whatever is inside a { } block like illustrated below
# for each line of data in the file
# 
# not clear if this is what you want
{
# --- note, missing opening { char

    for (i=10; i<=20; i++) {
      t=$i; 
      #old ver split(t,a,/[:,]/)}(a[2]+a[3])>=20 && a[3]>=10
      # new
      split(t,a,/[:,]/)
       if ( (a[2]+a[3])>=20 && a[3]>=10 ) {
          printf("%s\t", $i)
       }  # end if
     }    # end for i
     printf("\n")
}         # end awk loop 
          # that processes each line
          # of data from a a file    

あなたの質問を理解しているように、行の一部だけを印刷するには、awkより詳細printf("%s", "string")な機能に依存する必要があります。$iパラメータとして print に渡していることに注意してください。配列変数のa[2]いずれかを使用する必要がある場合があります。

IHTH

于 2013-08-17T22:36:45.450 に答える