2017-01-23 14 views
1

CSVファイルの2番目の列を合計したいと思います。それは完璧に動作シェルスクリプトを使用して列を合計する場合

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

は、私は以下のコードを使用していました。 ここに ifelseの状態を追加したいと思います。 私はcolum 3 =「A」と列4 =「B」

私はifelse句を追加する場合にのみ、列2を合計したいと思いますが、それはあなたがから構文を混合している

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の機能については悩んでいます。私は、第2列をif節で合計したいだけです。それは可能ですか? –

+0

いくつかのサンプルデータを投稿してください。 –

答えて

4

を動作しません。 Awkおよびbashを一緒に含む。私はなステートメント'$3 == "A" && $4 == "B"すなわち

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

として生成されたサンプルの入力のために、あなたはあなたがする必要がある Awkif-else句をしたい

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

と仮定すると、暗黙的に和演算のみであれば$3対等のアクションを行うことA$4B

となります。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

....そして、テキスト処理のための構文を正しく取得することは、恐ろしく困難です。デフォルトの動作は、プロセスやファイルの操作を容易にするために設計されており、テキスト処理ではありません。 [なぜシェルを使ってループを処理するかをテキストで判断する](http://unix.stackexchange.com/questions/169716/whyis-using-a-shell)を参照してください。 -loop-to-process-text-consider-bad-practice) –

関連する問題