从数组输入以供 awk 查找重复项

Input from an array for awk to find duplicates

我试图从一个数组中为 awk 输入数据:

awk -v var="${A[*]}" 'BEGIN{split(var,list,"\n"); for (i=1;i<=length(list);i++) print list[i]}'

还使用 awk 查找文件之间的重复项:

filecnt=$(find "${pmdir}" -type f)
awk -v  n=filecnt '{a[[=11=]]++}END{for (i in a)if (a[i]>1){print i, a[i];}}' $filecnt  >> ${outputfile} 

但是如果 awk 将数组作为输入,我很难找出如何做到这一点。 类似于:

awk -v var="${A[*]}" '{var[[=12=]]++}END{for (i in var)if (var[i]>1){print i, var[i];}}' 

A是从文件中读取的列数据:

for i in $( awk  -F ',' '{ print ; }' "${ifile}" )
do
    A[$j]=$i
    #echo "${A[$j]}" 
    j=$((j+1))
done

A 的例子是

0x10000
0x11000
0x01100
0x00010
0x11000
0x00010
0x00010

需要输出:

0x11000 2
0x00010 3

感谢您的建议。

这是你想要的吗?

$ printf '%s\n' "${A[@]}" | sort | uniq -cd | awk '{print , }'
0x00010 3
0x11000 2

或者如果您愿意:

$ printf '%s\n' "${A[@]}" | awk '{cnt[[=11=]]++} END{for (val in cnt) if (cnt[val]>1) print val, cnt[val]}'
0x11000 2
0x00010 3

或:

$ awk -v vals="${A[*]}" 'BEGIN{split(vals,tmp); for (i in tmp) cnt[tmp[i]]++; for (val in cnt) if (cnt[val]>1) print val, cnt[val]}'
0x11000 2
0x00010 3

请注意,最后一个依赖于 A[] 中包含空格或转义字符的 none 个值。

你的 for 循环不是首先填充 A[] 的方法,但是,这是:

A=()
while IFS= read -r i; do
    A+=( "$i" )
done < <(cut -d',' -f1 "$ifile")

或:

A=()
while IFS=',' read -r i _; do
    A+=( "$i" )
done < "$ifile"

或:

readarray -t A < <(cut -d',' -f1 "$ifile")