2016-07-17 44 views
0

我必須執行Shell代碼,它可以逐行讀取CSV文件,檢查某些列值中的每一行並根據條件製作另一個新的CSV文件。Shell代碼 - 通過循環讀取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 

注意:文件名是。廣州。 (1)我得到了錯誤:「意外令牌附近的語法錯誤`完成'」。

(2)我想檢查新的csv是否會完成幷包含行。

謝謝

+1

如果丟失一個管後'用zcat Filename'和$文件名之前在同一行?另外,爲什麼在shell中循環呢?爲什麼不讓awk處理整個文件而不是每行都運行它? '文件名= $ 1; zcat $文件名| awk - ' –

+0

你真的認爲'15美元'需要同時匹配這四種不同的正則表達式嗎?這就是你的代碼的含義。 – tripleee

回答

0

你不需要shell循環。只要你管輸出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〜/\.moo$/ || $ 0〜/ \。bar $ /'(同時注意這些parens是多餘的)。你必須重複'$ 3〜'或者重構一個正則表達式'$ 3〜/ \。(moo | bar)$ /'。 – tripleee

+0

Thanks @tripleee我更新了,但是保留了parens,因爲這裏有'||'和'&&'的混合。 – SLePort

相關問題