2017-01-23 95 views
1

我想總結一個CSV文件的第二列。shell腳本與其他列求和

我用下面的代碼:

awk -F'#' '{c+=$2}END{printf "count=%d\n",c}' file.csv 

它完美。 現在我想給它添加ifelse條件。 我想總結列2僅當式柱3 =「A」和第4列=「B」

我添加ifelse子句但它不工作

awk -F'#' 'if [ "$3" == 'A' && "$4" == 'B' ]; then c+=$2; fi 
END{printf "count=%d\n",c}' file.csv 
+1

您正在將'Awk'和'shell'的結構混合在一起。 – Inian

+0

是的。我是殼牌和Linux功能的noob。我只想用if子句總結第二列。那可能嗎 ? –

+0

請發佈一些示例數據。 –

回答

4

您正在從混合構建Awkbash在一起。假設你想在Awk你需要做的if-else條款,

awk -F'#' '$3 == "A" && $4 == "B"{c+=$2;} END{printf "count=%d\n",c}' file.csv 
count=41 

爲我公司生產的

$ cat file.csv 
junk#21#A#B 
junk#22#C#D 
junk#20#A#B 
junk#19#D#E 

即statment '$3 == "A" && $4 == "B"樣本輸入隱含意味着做和運算只有$3平等的行動A$4等於B

if的明確用法可以做成某事下面,

awk -F'#' '{if ($3 == "A" && $4 == "B") {c+=$2;}} END{printf "count=%d\n",c}' file 
count=41 

這是建議使用純bash腳本解析/遍歷文件,但對於純粹的做法,如果你想辦法,你可以這樣做

#!/bin/bash 

unset count 
# The '_' in read implies ignore rest of the line 
while IFS='#' read -r col1 col2 col3 col4 _ 
do 
    [[ "$col3" == "A" && "$col4" == "B" ]] && ((count+=col2)) 
    # Here the '[[' implies the if-clause and '&&' implies do on true condition 
done<file 

printf "%d\n" "$count" 
+2

它通常不被推薦用於性能:bash是可怕的慢 –

+1

....並且可怕地難以獲得用於文本處理正弦的語法正確的默認行爲旨在簡化過程和文件操作,而不是文本處理。請參閱[爲什麼要使用shell循環處理文本被認爲是壞習慣](http://unix.stackexchange.com/questions/169716/why-is-using-a-shell -loop到過程文本視爲壞實踐) –