Bash-скрипт для разделения файла по его содержимому, переименование разделенных файлов из другого файла

До сих пор я только читал, но теперь мне нужно начать со сложного вопроса. Я безумно гуглил, но не могу найти ответа, и он должен быть в BASH. (Спасибо за идеи вроде Perl, к сожалению, не вариант.)

У меня есть текстовый файл, в котором данные разделены символом | следующим образом:

DETAIL||||||||||103|line1  
DETAIL||||||||||103|line2  
DETAIL||||||||||105|line3  
DETAIL||||||||||433|line4  
DETAIL||||||||||433|line5 

Мне удалось разделить его на новые файлы с помощью 11-е ключевое поле, используя это:

cat extract_GL2_*.txt | grep DETAIL | awk -F\| '{print>>"SPLIT/"$11".txt"}'

С этим есть две проблемы:
1. Мне нужно было бы присвоить имена из другого файла с именем Company.txt (помещенного в родительскую папку SPLIT), имеющего значения ключевого столбца, подобные этому (так что в основном мне нужно заменить номер чем-то значимым):

Company.txt:

103|US100E1  
104|US100E1  
105|US100E1  
433|EMEAE1
  1. Как видно из примера, ключ не является уникальным, несколько значений могут быть объединены в одно на основе ключей выше Примечание: я бы предпочел иметь этот файл без ".txt", который необходим для вывода, но я рад переделать Company.txt, если сценарий будет проще.

Можно иметь второй шаг, который находит имя файла по ключу и выполняет слияние, удаляя старые файлы, но было бы более элегантно сделать на первом шаге «просто» замену имени целевого файла из второго файла. Мне не удалось оба метода, но меня устраивает то, что проще / быстрее.

Таким образом, разбиение должно основываться на значении из столбца 11 исходного файла (ов) и имени файла второго файла. Исходных файлов может быть больше, они должны добавляться, а разделенные файлы могут содержать более одного из ключевых полей в зависимости от назначения имени файла.

Компания.txt и extract_GL2 * находятся в одной папке, разделенные файлы должны находиться в подпапке SPLIT.

Небольшой код (часть, которую я не могу сделать, это псевдо, но остальное тоже не могу протестировать):

#!/bin/bash  
while read line; do  
 company="${line|awk -F\| '{print $11}'}"  
 newfilename="${cat Company.txt | grep $company | awk -F\| '{print $2}' | head -1}" + ".txt"  
 _replace chr(34) to space in $line_  
 _replace ,  to space in $line_  
 _replace | to , in $line_  
 echo "$line" >> "SPLIT\$newfilename.txt"  
done < "extract_GL2_*.txt"  

Большое спасибо: Тамас

1
задан 8 January 2020 в 02:47

1 ответ

Поместите файлы в родительский каталог каталога SPLIT и создайте файл сценария , выполнив следующие шаги , и назовите его my_script. sh , поэтому структура этого каталога будет такой:

Company.txt
extract_GL2_1.txt
extract_GL2_23.txt
my_script.sh
SPLIT/

ВАЖНО:

  • Файлы в каталоге SPLIT будут созданы и удалены, НЕ РАЗМЕЩАЙТЕ КАКИЕ-ЛИБО ФАЙЛЫ В РАЗДЕЛЕНИЕ КАТАЛОГ .

  • Запускайте сценарий ТОЛЬКО ОДИН РАЗ , иначе вы получите повторяющиеся записи в файлах результатов.


Чтобы создать и использовать файл сценария, выполните следующие действия:

  1. Создайте и отредактируйте файл сценария в родительском каталоге, выполнив следующую команду в терминале ( cd на каталог сначала) :

    nano my_script.sh

  2. Скопируйте и вставьте следующий код в редактор:

#!/bin/bash

echo
echo "splitting files ..."
echo
cat extract_GL2*.txt |
        while read line
                do
                        echo "$line" | grep DETAIL | awk -F\| '{print >> "SPLIT/"$11".txt"}'
                done


echo "renaming splitted files ..."
echo
        while IFS='|' read f1 f2
                do
                        mv -n "SPLIT/$f1.txt" "SPLIT/$f2.txt" 2> /dev/null
                done < "Company.txt"


echo "combining splitted files ..."
echo
        while IFS='|' read f1 f2
                do
                        cat "SPLIT/$f1.txt" >> "SPLIT/$f2.txt" 2> /dev/null
                done < "Company.txt"

echo "cleaning up ..."
echo
        while IFS='|' read f1 f2
                do
                        rm "SPLIT/$f1.txt" 2> /dev/null
                done < "Company.txt"

  1. Сохраните файл сценария и выйдите из редактора, нажав Ctrl + X , затем нажмите Y .

  2. Сделайте файл сценария исполняемым, выполнив следующую команду в терминале:

    chmod + x my_script.sh

  3. Запустите сценарий, выполнив следующую команду в терминале:

    bash my_script.sh

] Готово

Удачи

0
ответ дан 9 January 2020 в 00:36

Другие вопросы по тегам:

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