объединить файлы с одинаковыми префиксными текстовыми файлами в один - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь использовать bash для слияния / объединения всех текстовых файлов в каталоге с тем же префиксом в один текстовый файл. Спасибо :).

каталог

111.txt
aaa
aaa
222_1.txt
bbb
222_2.txt
ccc
ccc
333_1.txt
aaa
333_2.txt
ccc
ccc
333_3.txt
bbb

желаемый

111.txt
aaa
aaa
222.txt
bbb
ccc
ccc
333.txt
aaa
ccc
ccc
bbb

bash

for file in `ls`|cut -d"_" -f1 ; do
  cat ${file}_* > ${file}
done

Ответы [ 2 ]

5 голосов
/ 04 августа 2020

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

# IMPORTANT: Assumes there are no suffix-less file names that contain a _
declare -A prefixes
for f in *; do
    prefixes[${f%_*}]=
done

for f in "${!prefixes[@]}"; do
    [ -f "$f".txt ] && continue  # 111.txt doesn't need anything done
    cat "$f"_* > "$f".txt
done
1 голос
/ 04 августа 2020

создайте тестовую среду так же, как вы

mkdir -p tmp/test
cd !$
touch {111,222,333}.{txt,_2.txt,_3.txt}
cat > 111.txt
aaa
aaa

и т. Д.

тогда вы знаете, как увеличивать имена файлов:

for i in $( seq 1 3 ) ; do echo $i*  ; done                                                                                                                
111._2.txt 111._3.txt 111.txt
222._2.txt 222._3.txt 222.txt
333._2.txt 333._3.txt 333.txt

так вы создаете свои результирующие файлы, и вот ответ механизма на ваши нужды:

for i in $( seq 1 9 ) ; do  cat $i* >> new.$i.txt  ; done

и, наконец,

ls -l new.[1-3]*
-rw-r--r-- 1 francois francois 34 Aug  4 14:04 new.1.txt
-rw-r--r-- 1 francois francois 34 Aug  4 14:04 new.2.txt
-rw-r--r-- 1 francois francois 34 Aug  4 14:04 new.3.txt

все 3 * содержимое в новом формате. ". txt например здесь. вам нужно только установить желаемое место назначения файла для добавления в контент и, если необходимо, но не задавать в исходном вопросе сортировку данных по алфавиту c порядку или числовому ... et c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...