У меня есть текстовый файл sample.txt как:

=====record1
title:javabook
price:$120
author:john
path:d:
=====record2
title:.netbook
author:paul
path:f:
=====record3
author:john
title:phpbook
subject:php
path:f:
price:$150
=====record4
title:phpbook
subject:php
path:f:
price:$150

Из этого я хочу разделить данные на основе автора. Он должен быть разбит на два файла, которые содержат:

test1.txt

=====record1
    title:javabook
    price:$120
    author:john
    path:d:
=====record3
    author:john
    title:phpbook
    subject:php
    path:f:
    price:$150

а также

test2.txt

=====record2
    title:.netbook
    author:paul
    path:f:

Я хочу , чтобы динамически классифицировать основной файл sample.txt в субфайлы на основе авторского поля.

1 ответ1

3

Используя awk , сохраняйте поля в переменных. Когда маркер записи достигнут, запишите поля в соответствующий файл (используя имя автора).

-F: указывает, что поля разделены на ":"

Эта строка $1 ~ /author/ { author=$2 } если первое поле строки "author", сохраните значение в переменной author. Это необходимо, поскольку для записи записи должен быть файл с именем автора.

Используя substr() для извлечения первых пяти символов, если маркер начала записи "=====", если найден, данные (сохраненные в переменной rec ) записываются в соответствующий файл автора.

 awk -F: '
    $1 ~ /author/ { author=$2; }
    {
        if (substr($1,0,5) == "=====" && author != "") {
            print rec >> (author".txt")
            rec=$0; author=""
        }
        else
            rec=rec "\n" $0
    }
    END { if (author != "") print rec >> (author".txt") }
    ' authors.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .