基于B列唯一性的A列AWK计数

时间:2019-11-02 21:04:26

标签: linux bash

我有一个包含多个列的文件,我想根据第二列的值对第一列是唯一的来计算一个列的出现 例如:

column 10            column 15
orange               New York
green                New York
blue                 New York
gold                 New York
orange               Amsterdam
blue                 New York
green                New York
orange               Sweden
blue                 Tokyo
gold                 New York

我对使用诸如awk之类的命令还很陌生,并且希望获得更多实用知识。

我尝试了

的一些不同变体
awk '{A[$10 OFS $15]++} END {for (k in A) print k, A[k]}' myfile

但是,由于不太了解代码,所以输出不是我期望的。

我期望

的输出
orange     3
blue       2
green      1
gold       1

2 个答案:

答案 0 :(得分:0)

使用GNU awk。我认为tab是您的字段分隔符。

awk '{count[$10 FS $15]++}END{for(j in count) print j}' FS='\t' file | cut -d $'\t' -f 1 | sort | uniq -c | sort -nr

输出:

      3 orange
      2 blue
      1 green
      1 gold

我想它可能会更优雅。

答案 1 :(得分:0)

单个GNU awk调用版本(也适用于非GNU awk,只是不对输出进行排序):

$ gawk 'BEGIN{ OFS=FS="\t" }
        NR>1 { names[$2,$1]=$1 }
        END { for (n in names) colors[names[n]]++;
              PROCINFO["sorted_in"] = "@val_num_desc";
              for (c in colors) print c, colors[c] }' input.tsv
orange  3
blue    2
gold    1
green   1

根据需要调整列号以匹配实际数据。


使用sqlite3的奖励解决方案:

$ sqlite3 -batch -noheader <<EOF
.mode tabs
.import input.tsv names
SELECT "column 10", count(DISTINCT "column 15") AS total
FROM names
GROUP BY "column 10"
ORDER BY total DESC, "column 10";
EOF
orange  3
blue    2
gold    1
green   1