До сих пор я только читал, но теперь мне нужно начать со сложного вопроса. Я безумно гуглил, но не могу найти ответа, и он должен быть в 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
Можно иметь второй шаг, который находит имя файла по ключу и выполняет слияние, удаляя старые файлы, но было бы более элегантно сделать на первом шаге «просто» замену имени целевого файла из второго файла. Мне не удалось оба метода, но меня устраивает то, что проще / быстрее.
Таким образом, разбиение должно основываться на значении из столбца 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"
Большое спасибо: Тамас
Поместите файлы в родительский каталог каталога SPLIT
и создайте файл сценария , выполнив следующие шаги , и назовите его my_script. sh
, поэтому структура этого каталога будет такой:
Company.txt
extract_GL2_1.txt
extract_GL2_23.txt
my_script.sh
SPLIT/
Файлы в каталоге SPLIT
будут созданы и удалены, НЕ РАЗМЕЩАЙТЕ КАКИЕ-ЛИБО ФАЙЛЫ В РАЗДЕЛЕНИЕ
КАТАЛОГ .
Запускайте сценарий ТОЛЬКО ОДИН РАЗ , иначе вы получите повторяющиеся записи в файлах результатов.
Чтобы создать и использовать файл сценария, выполните следующие действия:
Создайте и отредактируйте файл сценария в родительском каталоге, выполнив следующую команду в терминале ( cd
на каталог сначала) :
nano my_script.sh
Скопируйте и вставьте следующий код в редактор:
#!/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"
Сохраните файл сценария и выйдите из редактора, нажав Ctrl + X , затем нажмите Y .
Сделайте файл сценария исполняемым, выполнив следующую команду в терминале:
chmod + x my_script.sh
Запустите сценарий, выполнив следующую команду в терминале:
bash my_script.sh
] Готово
Удачи