簡體   English   中英

AWK 根據 B 列的唯一性計算 A 列的出現次數

[英]AWK count occurrences of column A based on uniqueness of column B

我有一個包含幾列的文件,我想根據第一列 EX 獨有的第二列值來計算一列的出現:

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

但是,不太了解代碼,output 不是我所期望的。

我期待 output

orange     3
blue       2
green      1
gold       1

使用 GNU awk。 我假設制表符是您的字段分隔符。

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

Output:

      3 orange
      2 blue
      1 green
      1 gold

我想它可以更優雅。

單個 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM