1

Я хотел бы извлечь символы между первым и вторым подчеркиванием имен файлов в папке и сосчитать файлы такого типа, присутствующие в ней. Папка содержит файлы в определенном формате, например:

2305195303310_ABC_A08_1378408840043.hl7

2305195303310_ABC_A08_1378408840043.hl7
Q37984932T467566261_DEF_R03_1378825633215.hl7
37982442T467537201_DEF_R03_1378823455384.hl7
37982442T467537201_MNO_R03_1378823455384.hl7
2305195303310_ABC_A08_1378408840053.hl7
Q37984932T467566261_DEF_R03_1378825633215.hl7
37982442T467537201_MNO_R03_1378823455384.hl7

и так далее

Вывод скрипта должен дать мне результат в виде:

ABC 3
DEF 3
MNO 2

2 ответа2

0

Вы можете сделать это классическим способом * nix, собрав вместе небольшие команды. Во- первых, найти интересующие файлы, для этого вы можете использовать оболочки подстановка:

for i in *_*_*; do echo "$i"; done

Эта команда напечатает все файлы в текущем каталоге, имя которых содержит два подчеркивания. Чтобы извлечь строку между этими подчеркиваниями, вы можете использовать команду cut, указав использовать _ в качестве разделителя полей и напечатать 2-е поле:

cut -d '_' -f 2

Передача первой команды через вторую напечатает интересующие вас строки, но она также напечатает пустую строку для тех случаев, когда между подчеркиванием нет символа (например, foo__bar ). Вы можете отфильтровать их, используя grep . который будет печатать только строки, содержащие хотя бы один символ (включая пробелы). Наконец, вы можете рассчитывать, передавая результаты через sort и uniq -c.

Соединение всего этого дает вам:

$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done | 
   grep . | sort | uniq -c

  3 ABC
  2 DEF
  1 MNO

Если вы действительно хотите, чтобы число было на другой стороне, вы можете использовать awk:

$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done | 
   grep . | sort | uniq -c | awk '{print $2,$1}'

ABC 3
DEF 2
MNO 1
-1
ls | cut -d_ -f2 | sort | uniq -c

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .