Как Awk Абзац в сложном текстовом файле? - PullRequest
2 голосов
/ 24 сентября 2010

У меня есть простой файл журнала, который очень грязный, и мне нужно, чтобы он был аккуратным.Файл содержит заголовки журналов, но все они перемешаны, поэтому мне нужно отсортировать файлы журналов по заголовкам журналов.Отсутствует статическое количество строк, что означает, что для каждого заголовка текстового файла нет фиксированного количества строк.И я использую AWK для сортировки заголовков.

Файлы журнала идут примерно так:

Car LogFile Header
<text>
<text>
<text>
Car LogFile Header
<text>
Car LogFile Header
<and so forth>

Это будет выведено так:

Car LogFile Header
<text>
<text>
<text>
-------------------
Car Logfile Header
<text>
<text>

Я сделал / искал простой код, но, похоже, он не работает.Может кто-нибудь, пожалуйста, направить меня?Спасибо!

#!/bin/bash

# usage: pargrep <infile> <searchpattern>

inFile="$1"
searchString="$2"

awk '
BEGIN {
    FS="\n"
    RS="-----"
}
/'"$searchString"'/ { print }
' ${inFile}

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Тонкая настройка ответа Дениса:

awk -v selector="$searchString" '
    BEGIN { 
        RS = "Car LogFile Header\n" 
        ORS = "------"
    }
    selector ~ $0 { 
        print RS $0 
    }
' "${inFile}"

Обратите внимание, что RS является входным разделителем записей.Я использовал ORS для иллюстрации.

Я предполагаю, что "Car LogFile Header" является константой.Если это динамично, дайте нам знать.

2 голосов
/ 24 сентября 2010

Лучше использовать передачу переменных, чем пытаться получить правильное сложное цитирование.

#!/bin/bash

# usage: pargrep <infile> <searchpattern>

inFile="$1"
searchString="$2"

awk -v selector=$searchString '
    BEGIN {
        FS="\n"
        RS="-----"
    }
    selector ~ $0 { print }
    ' "${inFile}"
...