查找数组中的重复项,并按对打印计数

问题描述 投票:0回答:2

我有一系列

value,location

arr=(test,meta my,amazon test,amazon this,meta test,google my,google hello,microsoft)

我想打印重复值、它们的数量/计数以及位置。

例如:

3 test: meta, amazon, google
2 my: amazon, google
1 this: meta
1 hello: microsoft

这里

test
出现了 3 次,分别是
meta
amazon
google

到目前为止,此代码将打印项目和位置

printf '%s\n' "${arr[@]}" | awk -F"," '!_[$1]++'
test,meta
my,amazon
this,meta
hello,microsoft

这将打印计数,但它将

value,location
作为一个值

printf '%s\n' "${arr[@]}" | sort | uniq -c | sort -r
   1 my,amazon
   1 my,google
   1 this,meta
   1 test,meta
   1 test,google
   1 test,amazon
   1 hello,microsoft
arrays bash awk uniq
2个回答
0
投票

将 GNU awk 用于数组的数组和长度(数组):

$ cat ./tst.sh
#!/usr/bin/env bash

arr=(test,meta my,amazon test,amazon this,meta test,google my,google hello,microsoft)

printf '%s\n' "${arr[@]}" |
awk -F',' '
    { vals_locs[$1][$2] }
    END {
        for ( val in vals_locs ) {
            out = length(vals_locs[val]) " " val ": "
            sep = ""
            for ( loc in vals_locs[val] ) {
                out = out sep loc
                sep = ", "
            }
            print out
        }
    }
'

$ ./tst.sh
1 hello: microsoft
1 this: meta
2 my: google, amazon
3 test: google, amazon, meta

0
投票

您可以考虑使用任何版本的

awk
的解决方案:

printf '%s\n' "${arr[@]}" |
awk -F, '
{
   for(i=1; i<NF; ++i) {
      row[$i] = (i == 1 ? "" : row[$i] ", ") $NF
      ++fq[$i]
   }
}
END {
   for (k in fq) print fq[k], k ":", row[k]
}' | sort -rn -k1

3 test: meta, amazon, google
2 my: amazon, google
1 this: meta
1 hello: microsoft

请注意,我已使用

sort
来根据您显示的预期输出获取输出。如果您不关心订购,可以删除
sort
命令。

© www.soinside.com 2019 - 2024. All rights reserved.