bash count последовательных файлов - PullRequest
0 голосов
/ 03 ноября 2018

Я довольно плохо знаком с сценариями 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 голосов
/ 03 ноября 2018

У вашего кода 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}'
0 голосов
/ 03 ноября 2018

Я бы сделал это так:

$ ls | awk -F_ '{print $1}' | sort | uniq -c | awk '{print $2 " " $1}'
prob01 3
prob02 2
0 голосов
/ 03 ноября 2018

Вы можете использовать printf + awk решение:

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

prob01 3
prob02 2
  • Мы используем printf для печати каждого файла, в котором есть хотя бы один _
  • Мы используем awk, чтобы получить счетчик первого элемента каждого файла, ограниченного _ с помощью ассоциативного массива.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...