извлечение строк текста из длинного файла

Заменить все пробелы на вкладки:

tr -s " " "\t" < datafile
2
29.09.2016, 10:28
2 ответа

Комбинация 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
0
27.01.2020, 22:19

Попробуйте:

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
1
27.01.2020, 22:19

Теги

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