У меня есть следующий список данных:

Account Number: 11111
Domain        : domain.com
     Quantity: 1
     Quantity: 2
    Processor: Intel Xeon E5-1650 V2 3.5GHZ, Hexa Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays

Account Number: 54321
Domain        : domain0.com
     Quantity: 1
    Processor: Intel Xeon E3-1240 V1 3.3Ghz, Quad Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays
     Quantity: 1

Account Number: 12345
Domain        : domain1.com
     Quantity: 1

Я хотел бы использовать sed / awk для удаления всех записей «Количество: X», за которыми не следует «Процессор:» в следующей строке. Я также хотел бы удалить строки «Номер учетной записи: XXXXX» и «Домен:», если следующие строки не содержат одновременно «Количество: X» и «Процессор:». Это, в свою очередь, изменит приведенные выше данные на:

Account Number: 11111
Domain        : domain.com
     Quantity: 2
    Processor: Intel Xeon E5-1650 V2 3.5GHZ, Hexa Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays

Account Number: 54321
Domain        : domain0.com
     Quantity: 1
    Processor: Intel Xeon E3-1240 V1 3.3Ghz, Quad Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays

Может ли кто-нибудь предоставить способ выполнить эту задачу с помощью sed или awk или их комбинации?

0
Joseph Ivan Hayhoe 9 Янв 2014 в 03:14

2 ответа

Лучший ответ
$ cat tst.awk
BEGIN{ RS=""; FS="\n" }
/Quantity:/ && /Processor:/ {
    for (i=1; i<=NF; i++) {
        if ( ! (($i ~ /Quantity:/) && ($(i+1) !~ /Processor:/)) ) {
            print $i
        }
    }
    print ""
}
$ 
$ awk -f tst.awk file
Account Number: 11111
Domain        : domain.com
     Quantity: 2
    Processor: Intel Xeon E5-1650 V2 3.5GHZ, Hexa Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays

Account Number: 54321
Domain        : domain0.com
     Quantity: 1
    Processor: Intel Xeon E3-1240 V1 3.3Ghz, Quad Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays
2
Ed Morton 8 Янв 2014 в 23:24

РЕДАКТИРОВАТЬ: Эрф ... Надо было прочитать вопрос, прежде чем отвечать.
Надеюсь, это должно сработать

BEGIN { 
        OFS=RS
        FS="\n"
        RS= ""
    }

    {
        selected = 0
        drop = 0
        for (i = 1; i <= NF ; i++)
        {
            if ($i ~ "Quantity:")
            {
                if ($(i+1) ~ "Processor:") selected = 1
                else  drop++
            }
            $i = $(i+drop)
        }
        if (selected) print
    }

Cmd

gawk -f processor.awk processor.txt

Выход

Account Number: 11111
Domain        : domain.com
     Quantity: 2
    Processor: Intel Xeon E5-1650 V2 3.5GHZ, Hexa Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays

Account Number: 54321
Domain        : domain0.com
     Quantity: 1
    Processor: Intel Xeon E3-1240 V1 3.3Ghz, Quad Core
    SERVERCHASSIS: Standard - Single PSU - No Hot Swap Bays
1
kuroi neko 9 Янв 2014 в 02:10