У меня есть 6 каталогов. Каждый каталог включает 8 текстовых файлов. Эти текстовые файлы совместно используют тот же префикс. Я должен объединить эти текстовые файлы следующим образом;
Примите, первый текстовый файл в directory_1 содержит файлы, содержащие текст abc_1
, directory_2 содержит файлы с текстом abc_2
и так далее. Объединенный текстовый файл для первых текстовых файлов должен быть в этой форме:
abc_1
abc_2
abc_3
..
abc_6
Второе, третье... и восьмые текстовые файлы также должны быть объединены с тем же правилом.
Ваши файлы должны быть поддающимися сортировке, так брать имена файлов в каждом конце каталога с числом от 1 до 8, такой как foo1
, foo2
... в одном каталоге и bar1
, bar2
... в другом и так далее, Вы могли использовать cat
и a for
цикл для конкатенации их:
for j in {1..8}; do cat directory_{1..6}/*$j > newfile$j; done
(никакая потребность "заключить в кавычки" переменную, которую мы знаем, является единственной цифрой), Это распечатает, в, например, newfile1
, содержание
directory_1/foo1
directory_2/bar1
directory_3/baz1
...
независимо от того, что то содержание, и в newfile2
содержание directory_1/foo2
, diectory_2/bar2
и т.д.
Неявный метод (может перестать работать, если несвязанные файлы с именем файла, заканчивающимся _ и число, находятся в том же каталоге), который называет каждый объединенный файл согласно номеру документа:
DIRS_BASE=directory_
for ((FNUM=1; FNUM<9; FNUM++)); do
cat ${DIRS_BASE}[1-6]/*_${FNUM} > merged_${FNUM}
done
(Более безопасное) использование явного метода списка префиксов, который называет каждый объединенный файл согласно номеру документа:
DIRS_BASE=directory_
PLIST=(abc def ghi jkl mno pqr)
NDIRS=${#PLIST[@]}
for ((FNUM=1; FNUM<9; FNUM++)); do
PLIST_NUM=(${PLIST[@]/%/_$FNUM})
cat ${PLIST_NUM[@]/#/$DIRS_BASE[1-$NDIRS]/} > merged_${FNUM}
done