从数组输入以供 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")
我试图从一个数组中为 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")