Пропустить первое совпадение в файле, используя Bash - PullRequest
0 голосов
/ 11 января 2019

у меня этот файл содержит данные такого типа

NAME: "Chassis", DESCR: "Nexus5020 Chassis"
PID: N5K-C5020P-BF     , VID: V04 , SN: SS613390FZT

NAME: "Module 1", DESCR: "40x10GE/Supervisor"
PID: N5K-C5020P-BF     , VID: V04 , SN: JA91344BHNK

NAME: "Module 2", DESCR: "6x10GE Ethernet Module"
PID: N5K-M1600         , VID: V01 , SN: JA71228018M

NAME: "Module 3", DESCR: "8x1/2/4G FC Module"
PID: N5K-M1008         , VID: V01 , SN: JAB1531020C

С помощью сценария оболочки мне удалось получить соответствующие данные, которые являются строками в DESCR: и SN: и сохранить их в CSV-файле, как показано ниже;

Nexus5020 Chassis,SS613390FZT
40x10GE/Supervisor,JA91344BHNK
6x10GE Ethernet Module,JA71228018M
8x1/2/4G FC Module,JAB1531020C

У меня вопрос, какая модификация нужна, чтобы скрипт пропустил первое совпадение для DESCR: и SN: так получится так в выводе?

40x10GE/Supervisor,JA91344BHNK
6x10GE Ethernet Module,JA71228018M
8x1/2/4G FC Module,JAB1531020C

Сценарий здесь:

#/bin/bash

re_descr='DESCR: "([^"]+)"'
re_sn='SN: ([^[:space:]]+)'

while read -r; do
        if [[ $REPLY =~ $re_descr ]]; then
                descr=${BASH_REMATCH[1]}
                continue
        fi
        if [[ $REPLY =~ $re_sn ]]; then
                sn=${BASH_REMATCH[1]}
        fi
        if [[ $descr && $sn ]]; then
                printf '%s\t%s\n' "$descr","$sn"
                unset -v descr sn
        fi
done < <(cat <filename>)

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Вместо передачи входа в цикл while с конца, передайте вход как внутренний цикл.

Попробуйте удалить первую строку для нескольких входных файлов

$ cat in.txt
line1
line2
line3
line4
$ perl -ne ' { print if $.>1 ; close(ARGV) if eof } ' in.txt in.txt | while read -r a ; do ; echo $a  ; done
line2
line3
line4
line2
line3
line4
$

Я просто использовал in.txt in.txt, чтобы показать, что он удаляет первую строку ..

0 голосов
/ 13 января 2019

Вы можете добавить переменную firstline (инициализируйте ее как true). Если у вас есть совпадения sn и descr, установите переменную на false, иначе напечатайте.

РЕДАКТИРОВАТЬ: Альтернатива.

Вы можете использовать tr и sed для манипулирования файлом.
Сначала убедитесь, что все строки (кроме первой) начинаются с DESCR:

tr -d "\n" < file | sed 's/DESCR/\n&/g; $ s/$/\n/'

Первая строка без DESCR, вторая - та, которую вы хотите игнорировать.
Так что обработайте этот поток из третьей строки:

tr -d "\n" < file | sed 's/DESCR/\n&/g; $ s/$/\n/' |
   sed -rn '3,$ s/DESCR: "([^"]+).*SN: ([^[:space:]]+).*/\1,\2/p' 
0 голосов
/ 11 января 2019

Вы можете заменить done < <(cat <filename>) на done < <filename> | sed 1d.

Это выглядит так ( с /tmp/foo в качестве входного файла ):

#/bin/bash

re_descr='DESCR: "([^"]+)"'
re_sn='SN: ([^[:space:]]+)'

while read -r; do
        if [[ $REPLY =~ $re_descr ]]; then
                descr=${BASH_REMATCH[1]}
                continue
        fi
        if [[ $REPLY =~ $re_sn ]]; then
                sn=${BASH_REMATCH[1]}
        fi
        if [[ $descr && $sn ]]; then
                printf '%s\t%s\n' "$descr","$sn"
                unset -v descr sn
        fi
done < /tmp/foo | sed 1d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...