我编写了以下命令来遍历文件第二列中的一组字符串,然后对第11列的每个字符串进行排序,然后取第二列和第十一列并计算唯一出现次数。非常简单,但它似乎进入无限循环,我不明白为什么。非常感谢你的帮助。
for item in $(cat file.txt | cut -f2 -d " "| uniq)
do
sort -k11,11 file.txt | cut -f2,11 -d " " | uniq -c | sort -k2,2 > output
done
答案 0 :(得分:1)
这里没有无限循环,但 是一个非常愚蠢的循环(需要很长时间才能运行,而不能完成脚本的声明目的)。让我们来看看如何更加理智地实现这一目标:
使用counts.txt
的临时文件,以避免在每次迭代时重新运行sort
,cut
和uniq
步骤:
sort -k11,11 file.txt | cut -f2,11 -d " " | uniq -c >counts.txt
while read -r item; do
fgrep -e " ${item}" counts.txt
done < <(cut -f2 -d' ' <file.txt | uniq)
更好的是,使用bash 4关联数组而没有临时文件:
# reads counts into an array
declare -A counts=( )
while read -r count item; do
counts[$item]=count
done < <(sort -k11,11 file.txt | cut -f2,11 -d " " | sort | uniq -c)
# reads counts back out
while read -r item; do
echo "$item ${counts[$item]}"
done < <(cat file.txt | cut -f2 -d " "| sort | uniq)
......那就是说,只有当你想用sort
来排序数据时才会这样做。如果您不需要这样做,后一部分可以替换为:
# read counts back out
for item in "${!counts[@]}"; do
echo "$item ${counts[$item]}"
done