Как извлечь запись в текст на совпадение строк в файле с помощью bash

У меня есть текстовый файл 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

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

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 на вложенные файлы на основе динамического поля автора.

0
задан 14 December 2015 в 06:01

1 ответ

#!/bin/bash

tr '\n' ' ' < sample.txt | sed 's:=====:\n=====:g' | sed 's: *$::g' >tmp1

grep "author:john" tmp1 | sed 's: :\n\t:g' > test1.txt
grep "author:paul" tmp1 | sed 's: :\n\t:g' > test2.txt

rm tmp1

команда «tr» заменяет каждый символ новой строки на пробел (весь файл теперь равен 1 строке)
это передается в «sed», что вызывает каждый «=====» начать на новой линии. Второй «sed» удалит завершающие пробелы. Все это отправляется во временный файл. Теперь у вас есть 1 «запись» на строку.

Первый «grep» будет читать из временного файла и выводить все записи, где «author» равен «john», эти записи передаются в «sed», который заменяет каждый пробел новой строкой с последующим табуляцией точно воспроизвести макет OP) и отправить его в файл с именем test1.txt

Второй идеал grep для «paul» и «test2.txt»

Последнее действие - удаление временного файла который больше не нужен,

0
ответ дан 14 December 2015 в 06:01

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

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