Как автоматизировать объединение нескольких серий файлов с помощью расширенных шаблонов подстановки и отрицания bash?

Большое спасибо за любые советы и отзывы по этому поводу. Это моя ситуация:

У меня есть каталог с несколькими сотнями файлов, которые начинаются с foo * и заканчиваются * .txt. Однако между началом и концом они различаются уникальным идентификатором Group #. #, И файлы выглядят так:

foo.Group1.1.txt
foo.Group1.2.txt
foo.Group1.4.txt
foo.Group2.45.txt
.
.
.
foo.Group16.9.txt 

Файлы начинаются с Group1 и заканчиваются группой 16. Это простые текстовые файлы с одним столбцом, каждый файл состоит из нескольких тысяч строк. Каждая строка - это номер.

Я хочу сделать серию конкатенаций с этими файлами, в которой я объединяю все файлы, кроме этих, с Group1, а затем со всеми файлами, кроме Group1 и Group2, а затем со всеми файлами, кроме Group1, Group2 и Group3 и так далее, пока я не буду осталось только последняя группа: Group16

Для этого я использую расширенное выражение подстановки bash с синтаксисом отрицания для объединения всех файлов, кроме тех, которые имеют Group1 в качестве своего идентификатора.

Я делаю каталог jacks и выводю объединенный файл в текстовый файл в этом подкаталоге:

cat !(*Group1.*) > jacks/jackknife1.freqs.txt

Затем я могу продолжить использование этой команды, но добавив Group2 и Group3 для последующих конкатенаций.

cat !(*Group1.*|*Group2.*) > jacks/jackknife2.freqs.txt
cat !(*Group1.*|*Group2.*|*Group3.*) > jacks/jackknife3.freqs.txt

Технически это работает. И 16 групп не так уж и страшно, чтобы сделать это вручную. Но мне интересно, есть ли способ, возможно, используя циклы или сценарии bash, чтобы автоматизировать этот процесс и ускорить его?

Буду признателен за любые советы или подсказки по этому вопросу!

большое спасибо, Даниэла


person Daniela Zárate    schedule 21.10.2020    source источник


Ответы (1)


Некоторые пытаются обойти bash подстановки

Попробуйте использовать echo до cat!

touch foo.Group{1..3}.{1..5}.txt
ls -l 
total 0
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.1.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.2.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.3.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.4.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group1.5.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.1.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.2.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.3.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.4.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group2.5.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.1.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.2.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.3.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.4.txt
-rw-r--r-- 1 user  user  0 Oct 21 18:37 foo.Group3.5.txt

потом

echo !(*Group1.*)
foo.Group2.1.txt foo.Group2.2.txt foo.Group2.3.txt foo.Group2.4.txt foo.Group2.5.txt foo.Group3.1.txt foo.Group3.2.txt foo.Group3.3.txt foo.Group3.4.txt foo.Group3.5.txt

Хорошо и

echo !(*Group[23].*)
foo.Group1.1.txt foo.Group1.2.txt foo.Group1.3.txt foo.Group1.4.txt foo.Group1.5.txt

Or

echo !(*Group*(1|3).*)
foo.Group2.1.txt foo.Group2.2.txt foo.Group2.3.txt foo.Group2.4.txt foo.Group2.5.txt

Или даже

echo !(*Group*(1|*.3).*)
foo.Group2.1.txt foo.Group2.2.txt foo.Group2.4.txt foo.Group2.5.txt foo.Group3.1.txt foo.Group3.2.txt foo.Group3.4.txt foo.Group3.5.txt

и

echo !(*Group*(1|*.[2-4]).*)
foo.Group2.1.txt foo.Group2.5.txt foo.Group3.1.txt foo.Group3.5.txt

Я дам вам подумать о последних двух образцах! ;-)

person F. Hauri    schedule 21.10.2020