如何计算特定列具有两种模式的行?

时间:2019-05-10 07:03:46

标签: linux

year start  year end    location    topic   data type   data value
2016    2017    AL  Alcohol Crude Prevalence    16.9
2016    2017    CA  Alcohol Other   15
2016    2017    AZ  Neuropathy  Other   13.1
2016    2017    HI  Smoke   Crude Prevalence    20
2016    2017    IL  Cancer  Other   20
2016    2017    KS  Cancer  Other   14
2016    2017    AZ  Smoke   Crude Prevalence    16.9
2016    2017    KY  Cancer  Other   13.8
2016    2017    LA  Alcohol Crude Prevalence    18

需要答案来计算与“主题”“酒精”和“癌症”相关的行。

我已经获得名为“ topic”的列的索引,但是我要从“ topic”中提取的内容不正确,因此我无法计算包含“酒精”和“癌症”的行“,如何解决?

这是我的代码:

awk '{print $4}' AAA.csv > topic.txt
head -n5 topic.txt | less

2 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

对awk的调用获取了相关的列,grep过滤了关键字,字数统计了行数

$ awk '{ print $4 }' data.txt | grep -e Alcohol -e Cancer | wc -l
6

答案 1 :(得分:1)

在grep中使用正则表达式:

cat data.txt|tr -s " "|cut -d " " -f 4|grep -E '(Alcohol|Cancer)'|wc -l

如果您确定“酒精”和“癌症”一词仅出现在第4列中,您可以这样做

grep -E '(Alcohol|Cancer)' data.txt|wc -l

添加

OP在评论中询问:

如果有很多列,而我不知道它们的索引。如何仅根据列名(“主题”)提取列?

此代码将在变量i中存储包含“主题”的列。本质上,代码将data.txt的第一行存储为数组变量s,然后解析数组元素,直到找到所需的单词。 (由于数组索引从0开始,因此您必须在末尾将i加1。

注意:该代码仅在实际上找到“主题”列时才有效。

head -n 1 data.txt|read -a s
for (( i=0; i<${#s[@]}; i++ ))
do
  if [ "${s[$i]}" == "topic" ]
  then
     break
  fi
done
i=$(( $i + 1 ))