bash中的无限循环

时间:2015-03-11 16:02:43

标签: bash

我编写了以下命令来遍历文件第二列中的一组字符串,然后对第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

1 个答案:

答案 0 :(得分:1)

这里没有无限循环,但 是一个非常愚蠢的循环(需要很长时间才能运行,而不能完成脚本的声明目的)。让我们来看看如何更加理智地实现这一目标:


使用counts.txt的临时文件,以避免在每次迭代时重新运行sortcutuniq步骤:

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