2016-03-23 74 views
0

我寫了一個bash腳本調用Python腳本掃描漏洞:擊/殼牌:CSV文件處理問題

#scan.sh 
while IFS=, read -r n d ;do 
    python scan.py $d 443 | sed "s/^\(.\)/$n,\1/" 
done < Input.csv 

Input.csv樣子:

#Input.csv 
1,abc.com 
2,xyz.com 
3,pqr.com 
......... 

Output.csv應該像:

1,abc.com,True,2016-03-06 
1,abc.com,False,2016-03-06 
1,abc.com,True,2016-03-06 
1,abc.com,True,2016-03-06 
2,xyz.com,False,2016-03-06 
2,xyz.com,False,2016-03-06 
2,xyz.com,False,2016-03-06 
2,xyz.com,False,2016-03-06 
3,pqr.com,True,2016-03-06 
3,pqr.com,True,2016-03-06 
3,pqr.com,True,2016-03-06 
3,pqr.com,True,2016-03-06 
........................ 

每個ID將有在output.csv四個條目有不同的結果。

  1. 如果4個條目的一個IDTrue,它必須是True,需要有一個ID一個條目。
  2. 如果ID的所有四個條目都是False,則它必須是False並且有一個條目。
  3. 如果ID的所有四個條目都是True,則它必須是True並且有一個條目。

這樣:

# processed_out.csv 

1,abc.com,True,2016-03-06 
2,xyz.com,False,2016-03-06 
3,pqr.com,True,2016-03-06 
........ 

我怎樣才能達到這個情況下,只有通過用awk/sed的?

僅供參考:我是bash腳本編程的初學者。

+3

你想在bash中做到這一點的任何理由?您已經有了一個執行「重要」工作的Python腳本。如果讓這個腳本首先將所需格式的數據吐出,是不是更容易? –

+0

@MarcB我不希望修改主腳本中的任何單行編輯,坦率地說,我更感興趣學習bash編程中的新東西;) – Arun

+0

@MarcB即使在#scan.sh腳本中,我在輸出結果中插入/前綴每個域的標識(sed「s /^\(.\)/$ n,\ 1 /」)。我真的愛上了bash! – Arun

回答

3

這是使用awk很簡單:

awk -F, -v OFS=, ' 
    $3 == "True" {ntrue++} 
    NR%4 == 0 { 
     $3 = (ntrue > 0) ? "True" : "False" 
     print 
     ntrue = 0 
    } 
' output.csv > processed_out.csv 
+0

謝謝!這是乾淨的方法 – Arun

2

awk來救援!

$ pr -4ats, file | 
    awk -F, -v OFS=, '{for(i=3;i<=NF;i+=4) 
         if($i=="True") {$3=$i; break}; 
        print $1,$2,$3,$4}' 

1,abc.com,True,2016-03-06 
2,xyz.com,False,2016-03-06 
3,pqr.com,True,2016-03-06 

pr將相關記錄放在一起,用相應位置中的任何「真」值覆蓋狀態。

+1

不錯。 'pr'的替代方法是'paste -d, - - - -