Bash 使用if-else对列求和的shell脚本

Bash 使用if-else对列求和的shell脚本,bash,shell,awk,Bash,Shell,Awk,我想对CSV文件的第二列求和 我使用了下面的代码: awk -F'#' '{c+=$2}END{printf "count=%d\n",c}' file.csv 它工作得很好。 现在我想向它添加ifelse条件。 仅当列3='A'和列4='B'时,我想对列2求和 我添加了一个ifelse子句,但它不起作用 awk -F'#' 'if [ "$3" == 'A' && "$4" == 'B' ]; then c+=$2; fi END{printf "count=%d\n",c}

我想对CSV文件的第二列求和

我使用了下面的代码:

awk -F'#' '{c+=$2}END{printf "count=%d\n",c}' file.csv
它工作得很好。 现在我想向它添加
ifelse
条件。 仅当列3='A'和列4='B'时,我想对列2求和

我添加了一个
ifelse
子句,但它不起作用

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

您正在将来自
Awk
bash
的构造混合在一起。假设您需要在
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
i、 e.
“$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"
#/bin/bash
未设置计数
#read中的“\u1”表示忽略行的其余部分
而IFS='#'读-r col1 col2 col3 col4_
做
[[“$col3”==“A”&&“$col4”==“B”]&&((计数+=col2))
#这里,“[]”表示if子句,“&&&”表示do on true条件

完成您正在将来自
Awk
bash
的构造混合在一起。假设您需要
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
i、 e.
“$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"
!/bin/bash
未设置计数
#read中的“\u1”表示忽略行的其余部分
而IFS='#'读-r col1 col2 col3 col4_
做
[[“$col3”==“A”&&“$col4”==“B”]&&((计数+=col2))
#这里,“[]”表示if子句,“&&&”表示do on true条件

doneYou正在将
Awk
shell
的结构混合在一起。是的。我不了解shell和Linux函数。我只想用if子句对第二列进行求和。可能吗?请发布一些示例数据。阅读Arnold Robbins的《有效Awk编程》,第四版,学习Awk,以及Chris Johnson的《shell脚本编写方法》学习shell。它们是两个完全不同的工具,每个工具都有各自的用途和语法。您将
Awk
shell
的结构混合在一起。是的。我不了解shell和Linux函数。我只想用if子句对第二列进行求和。可能吗?请发布一些示例数据。阅读有效的Awk编程,第四版,由Arnold Robbins学习awk,由Chris Johnson学习Shell。它们是两种完全不同的工具,每种工具都有各自的用途和语法。通常不推荐使用这种工具:bash速度非常慢……而且在defa中很难获得文本处理的正确语法ult行为旨在简化流程和文件操作,而不是文本处理。请参阅,对于性能而言,通常不建议这样做:bash速度非常慢……而且很难为文本处理获得正确的语法,因为默认行为旨在简化流程和文件操作,而不是文本处理。请参阅