2016-07-17 12 views
0

CSVファイルを1行ずつ読み込み、いくつかの列の値のすべての行をチェックし、条件に従って別の新しいCSVファイルを作成するシェルコードを実行する必要があります。シェルコード - ループでCSVファイルを読み込んで別のファイルを作成する

私はこのようなコードを開始しました:

FileName=$1 
    while read line 
    do 

    zcat FileName awk -F'\t' '$3 ~/.jar/ || $3 ~/.msi/ || $3 ~/.dll/ || $3 ~/.cab/ || $3 ~/.exe/ || $3 ~/.rar/ || $3 ~/.mar/ || $3 ~/.tgz/ || $3 ~/.tar/ || $3 ~/.gz/ || $3 ~/.upd/ || $3 ~/.bin/ || $3 ~/.zip/ || $3 ~/.pogo/ || $3 ~/.dcr/ || $3 ~/.qgi/ || $3 ~/.deb/ || $3 ~/.ipa/ || $3 ~/symantec/ || $3 ~/windowsupdate/ || $3 ~/kaspersky/ || $3 ~/adobe.com/ && $42 ~/7/ && $15 ~/androiddownloadmanager/ && $15 ~/.apk/ && $15 ~/.pak/ && $15 ~/.vpx/ {Str="SW Download: " $3;Str>> New.csv} ' 

    echo "$line" >> new2.csv 

    done < FileName 

注:ファイル名が.gzがあります。

(1)予期しないトークン `done 'の近くで構文エラーが発生しました。

(2)新しいcsvが実行され、行が含まれているかどうかを確認したい。

ありがとうございました

+1

後 'Filename' ZCATと$ファイル名の前に同じライン上で不足しているパイプ?また、シェルでループするのはなぜですか?あなたはawkに各行のためにそれを実行するのではなく、ファイル全体を扱わせるのはどうですか? 'Filename = $ 1; zcat $ファイル名| awk - -' –

+0

あなたは本当に '$ 15'が4つの異なる正規表現に同時に一致する必要があることを意味しますか?それがあなたのコードの意味です。 – tripleee

答えて

0

シェルループは必要ありません。ただ、パイプあなたzcatawkに出力:

FileName=$1 

zcat "$FileName" | awk -F'\t' '($3 ~/\.jar/ || /\.msi/ || /\.dll/ || /\.cab/ || /\.exe/ || /\.rar/ || /\.mar/ || /\.tar/ || /\.gz/ || /\.upd/ || /\.bin/ || /\.zip/ || /\.pogo/ || /\.dcr/ || /\.qgi/ || /\.deb/ || /\.ipa/ || /symantec/ || /windowsupdate/ || /kaspersky/ || /adobe\.com/) && $42 ~/7/ && ($15 ~/androiddownloadmanager/ && /\.apk/ && /\.pak/ && /\.vpx/) {Str="SW Download: " $3;print Str > "New.csv"}' 

、変数を使用する権利構文は$FileName、ないFileNameです。

更新: tripleeeで指摘したように

awkコマンドは次のようになります。

zcat "$FileName" | awk -F'\t' '($3 ~/\.(jar|msi|dll|cab|exe|rar|mar|tar|gz|upd|bin|zip|.pogo|dcr|qgi|deb|ipa)/ || $3 ~/(symantec|windowsupdate|kaspersky|adobe\.com)/) && $42 ~/7/ && $15 ~/androiddownloadmanager/ && $15 ~/\.apk/ && $15~/\.pak/ && $15~/\.vpx/ {Str="SW Download: " $3;print Str }' 
+0

こちらの構文は正しくありません。 '($ 3〜/.moo$/ ||/\。bar $ /)'は '$ 3〜/.my$/||に相当します。 $ 0〜/ \。bar $/'(括弧が余分なものであることにも注意してください)。あなたは '$ 3〜'またはリファクタを$ regex $ 3〜/ \。(moo | bar)$/'という単一の正規表現に繰り返す必要があります。 – tripleee

+0

ありがとう@treepleeeここで '||'と '&&'の組み合わせがあるので、括弧を更新しました。 – SLePort

関連する問題