bash计数连续文件

时间:2018-11-03 07:51:45

标签: linux bash unix

我对bash脚本还很陌生,因此某些语法可能不是最佳的。如果看到一个请指出。

我在顺序命名的目录中有文件。

示例:prob01_01 prob01_03 prob01_07 prob02_01 prob02_03 ....

我试图让脚本遍历当前目录并计算每个问题有多少个扩展名。然后打印扩展名,然后计数

以上示例输出为:

prob01 3

prob02 2

这是我的代码:

#!/bin/bash
temp=$(mktemp)
element=''
count=0
for i in *
do
   current=${i%_*}
   if [[ $current == $element ]]
   then
      let "count+=1"
   else
      echo $element $count >> temp
      element=$current
      count=1
   fi
done
echo 'heres the temp:'
cat temp
rm 'temp'

问题:

当前输出:

prob1 3

所需的输出:

prob1 3

prob2 2

没有添加最后一个计数,因为它之后没有看到其他元素

我对可能解决方案的猜测:

最后一个追加发生在for循环的末尾吗?

3 个答案:

答案 0 :(得分:1)

您可以使用printf + awk解决方案:

printf '%s\n' *_* | awk -F_ '{a[$1]++} END{for (i in a) print i, a[i]}'

prob01 3
prob02 2
  • 我们使用printf来打印每个至少包含一个_的文件
  • 我们使用awk通过关联数组来获取每个文件的第一个元素,以_分隔的计数。

答案 1 :(得分:1)

您的代码有2个问题。
第一个问题不能回答您的问题。您创建一个临时文件,文件名存储在$temp中。您应该使用该文件,而不要使用固定名称temp的文件。
问题是您仅在看到新的问题/文件名时才写入结果。最后一个将不会打印。 仅解决这些问题将导致

results() {
   if (( count == 0 )); then
      return
   fi
   echo $element $count >> "${temp}"
}

temp=$(mktemp)
element=''
count=0
for i in prob*
do
   current=${i%_*}
   if [[ $current == $element ]]
   then
      let "count+=1" # Better is using ((count++))
   else
      results
      element=$current
      count=1
   fi
done
results
echo 'heres the temp:'
cat "${temp}"
rm "${temp}"

您可以在没有脚本的情况下使用

ls prob* | cut -d"_" -f1 | sort | uniq -c

如果要按给定显示输出,则需要再执行一步。

ls prob* | cut -d"_" -f1 | sort | uniq -c | awk '{print $2 " " $1}'

答案 2 :(得分:0)

我会这样:

$ ls | awk -F_ '{print $1}' | sort | uniq -c | awk '{print $2 " " $1}'
prob01 3
prob02 2
相关问题