我对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循环的末尾吗?
答案 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