Два решения в этом ответе:
Один из способов спаривания одного набора файлов с другим состоит в том, чтобы перебрать один из наборов и создать из них имена файлов другого. Это было бы полезно в ситуациях, когда вы можете не знать точно, какой может быть суффикс имени файла или сколько файлов у вас есть в наборе, но тем не менее хотите сопоставить любой файл в одном наборе с файлами в другом.
for verse in verse-*; do
letter1=1st-letter-${verse#verse-}
cat "$letter1" "$verse"
done >result.txt
... или просто
for verse in verse-*; do cat "1st-letter-${verse#verse-}" "$verse"; done >result.txt
Это перебирает все имена в текущем каталоге, которые начинаются со строки verse-
. Это будет включать все ваши файлы verse-00
, verse-01
и т.д. Если вы хотите убедиться, что совпадают только первые шесть (или если у вас есть другие файлы с тем же префиксом имени файла ), используйте шаблон verse-0[0-5]
вместо verse-*
.
В каждой итерации имя соответствующего файла 1st-letter
создается путем удаления префикса verse-
из текущего значения $verse
и добавления к нему префикса строки 1st-letter-
. Затем два файла объединяются.
Выход цикла в целом записывается в result.txt
.
Тестирование:
$ ls -l
total 48
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-00
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-01
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-02
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-03
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-04
-rw-r--r-- 1 kk wheel 26 Nov 19 11:48 1st-letter-05
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-00
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-01
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-02
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-03
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-04
-rw-r--r-- 1 kk wheel 21 Nov 19 11:48 verse-05
Здесь запускается описанный выше цикл.
$ cat result.txt
Contents of 1st-letter-00
Contents of verse-00
Contents of 1st-letter-01
Contents of verse-01
Contents of 1st-letter-02
Contents of verse-02
Contents of 1st-letter-03
Contents of verse-03
Contents of 1st-letter-04
Contents of verse-04
Contents of 1st-letter-05
Contents of verse-05
С не слишком старой версиейbash
(значение по умолчанию bash
в macOS слишком старое ), или с zsh
или yash
вы также можете зацикливаться на определенных нулевых -заполненных числах. с которым вы хотели бы работать,построение обоих имен файлов в цикле:
for num in {00..05}; do
cat "1st-letter-$num" "verse-$num"
done >result.txt
В более старой версии bash
(, которая не использует нулевые -заполненные целые числа в раскрытии фигурных скобок ), вы можете использовать
for num in 0{0..5}; do
cat "1st-letter-$num" "verse-$num"
done >result.txt
... и чтобы включить числа после 9
, вы можете использовать
for num in 0{0..9} {10..99}; do
cat "1st-letter-$num" "verse-$num"
done >result.txt
Это будет охватывать номера от 00
до 99
.
Это во многом зависит от того, насколько гибким должно быть ваше решение. Если вы знаете, что эти файлы всегда будут называться 1st-letter-NN
и verse-NN
, то вы можете сделать что-то вроде следующего в сценарии оболочки -
#!/bin/bash
OUTFILE=$1 # take output file from command-line
:>$OUTFILE # and initialize it as "empty" in case it already existed
for i in {00..05}
do
cat 1st-letter-$i >> $OUTFILE
cat verse-$i >> $OUTFILE
done
Затем вы можете вызвать этот скрипт, как в
user@host$./my_script.sh merged_content.txt
и объединенный контент появится в файле merged_content.txt
.
Начиная с этого, вы можете расширить его, чтобы сделать его более гибким по мере необходимости.