我有一系列
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
将 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
您可以考虑使用任何版本的
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
命令。