shell脚本用if else求和列

时间:2017-01-23 09:12:21

标签: bash shell awk

我想总结一下CSV文件的第二列。

我使用了以下代码:

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

完美无缺。 现在我想添加ifelse条件。 我想仅在第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 个答案:

答案 0 :(得分:4)

您正在将Awkbash的构造混合在一起。假设您需要if-else中的Awk条款,

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

即。仅当'$3 == "A" && $4 == "B"等于$3A等于$4

时,语句B才会隐含地表示执行和计算操作

if的明确用法可以在下面进行,

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

NOT 建议使用纯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"