Комбинация grep
и csplit
может выполнить эту работу: a) grep
ping все незавершенные строки плюс предыдущая информационная строка и b) разделение вывода на основе строки информационного комментария:
grep -v -B1 '^#' file | csplit -z - '/^#/' '{*}'
Т.е. не -v
извлекать строки, у которых есть # в начале ^ #
, но одна строка, предшествующая таким строкам -B1
. Затем разделите входящий конвейерный ввод -
на каждом # в начале строки, игнорируйте пустые файлы -z
и делайте это как можно чаще {*}
.
Переименование должно быть отдельным шагом ( csplit
autonames outpit как xx00, xx01 ... - измените пре- и суффикс с помощью -f
и - b
варианты соответственно)
#/bin/bash
for f in xx* ; do
mv "$f" "$( sed -n '2p' "$f" )".txt
done
Попробуйте:
awk -F, '/^#/{f=$NF".txt";cmt=$0; next} {printf "%s\n%s\n",cmt,$0 >f; close(f)}' file
Применяется к вашему образцу входных данных:
$ awk -F, '/^#/{f=$NF".txt";cmt=$0; next} {printf "%s\n%s\n",cmt,$0 >f; close(f)}' file
После выполнения вышеуказанного в каталоге находятся следующие файлы:
$ ls
file importantname1.txt importantname2.txt importantname3.txt
Содержимое новых файлов:
$ cat importantname1.txt
#info1 info2 info3 ,importantname1
importanttext1
$ cat importantname2.txt
#info1 info2 info3 ,importantname2
importanttext2
$ cat importantname3.txt
#info1 info2 info3 ,importantname3
importanttext3
Awk читает строку входного файла по строке. Наш скрипт классифицирует эти строки как комментарии или нет. Для строк комментариев сохраняется имя файла и комментарий. Если нет комментариев, создается и печатается новый файл
`-F,
Это указывает awk использовать запятую в качестве разделителя полей при вводе. Таким образом, имя файла всегда будет последним полем.
/ ^ # / {f = $ NF ".txt"; cmt = $ 0; next}
Если строка начинается с #
, мы сохраняем последнее поле, $ NF
, плюс .txt
как имя файла f
. Вся строка комментария сохраняется как cmt
. Затем мы говорим awk пропустить остальные команды и перейти к следующей строке
, чтобы начать заново.
printf "% s \ n% s \ n", cmt, $ 0> f; close (f)
Для строк без комментариев мы печатаем последний просмотренный комментарий cmt
и текущую строку $ 0
в имя последнего просмотренного файла f
. Затем мы закрываем дескриптор файла для f
.
Если поля, которые должны использоваться в качестве имен файлов, содержат /
, ОС интерпретирует имена файлов как включающие каталоги.Чтобы избежать этого, мы можем заменить все /
на -
, используя gsub (/ \ //, "-", f)
следующим образом:
awk -F, '/^#/{f=$NF".txt";gsub(/\//, "-", f); cmt=$0; next} {printf "%s\n%s\n",cmt,$0 >f; close(f)}' file