Объединение файлов в определенном порядке из двух разных списков имен

Попробуйте bbe , похожий на sed -редактор для двоичных потоков.

Справочная страница

bbe is a sed-like editor for binary files. Instead of reading input in lines as sed, bbe reads arbitrary blocks from an input stream and performs byte-related transformations on found blocks.

0
19.11.2019, 10:47
2 ответа

Два решения в этом ответе:

  1. Переберите файлы в одном наборе и создайте имена файлов в другом, и
  2. Цикл по числам и построение обоих имен файлов в цикле.

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

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.

1
28.01.2020, 02:38

Это во многом зависит от того, насколько гибким должно быть ваше решение. Если вы знаете, что эти файлы всегда будут называться 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.

Начиная с этого, вы можете расширить его, чтобы сделать его более гибким по мере необходимости.

0
28.01.2020, 02:38

Теги

Похожие вопросы