Синтаксический анализ файла из определенной строки в bash на Linux

у меня есть файл CSV, содержащий следующие регистры:

Name,Phone,Country
John,N/A,USA
Max,N/A,USA

Name,Color,Size
John,Blue,M
Max,Red,S

как я могу читать только регистры от имени, цвета, размера и далее, используя bash?

кроме того, как я могу ограничить вывод, пока он не достигнет EOF или пустой строки? Так это:

Name,Phone,Country
John,N/A,USA
Max,N/A,USA

Name,Color,Size
John,Blue,M
Max,Red,S

Dummy,Dummy,Dummy
Foo,Foo,Bar

не выход это:

John,Blue,M
Max,Red,S

Dummy,Dummy,Dummy
Foo,Foo,Bar

а точнее только это:

John,Blue,M
Max,Red,S

Я уже пробовал grep и sed но без удачи, я также пробовал хвост, но количество строк неизвестно, пока файл не будет читать.

7
задан arielnmz
17.01.2023 12:44 Количество просмотров материала 3687
Распечатать страницу

2 ответа

использование awk

$ awk '/^$/{f=0} f{print} /Name,Color,Size/{f=1}' file
John,Blue,M
Max,Red,S

как это работает

скрипт awk имеет одну переменную,f, который служит в качестве флага, чтобы определить, когда мы находимся внутри Name,Color,Size заблокировать.

  • /^$/{f=0}

    в пустой строке задайте f=0, чтобы сообщить, что мы вышли из Name,Color,Size заблокировать.

  • f{print}

    когда мы в блоке,f==1, печатать линия.

  • /Name,Color,Size/{f=1}

    когда мы достигнем Name,Color,Size заголовок, set f=1, чтобы сигнализировать, что мы в блоке.

использование GNU sed

$ sed -n '/Name,Color,Size/{:a; n; /./{p; ba;}}' file
John,Blue,M
Max,Red,S

как это работает

  • -n

    скажите sed ничего не печатать, если мы явно не попросим.

  • /Name,Color,Size/{...}

    если строка содержит Name,Color,Size заголовок, затем выполнить команды в фигурных скобках:

    • :a;

      определяет метку a.

    • n;

      это читается в следующей строке.

    • /./{p; ba;}

      если следующая строка не пуста, выведите ее (p) и филиала (b) назад к label a.

    таким образом, все строки внутри блока будут прочитаны и напечатаны и печать останавливается с первой пустой строки.

2
отвечен John1024 2023-01-18 20:32

вы можете использовать sed, чтобы показывать только вещи после определенной строки, делая что-то вроде

sed -e '0,/Name,Color,Size/d' <file>

таким образом, вы увидите только строки, которые идут после Name,Color,Size

1
отвечен Eric Renouf 2023-01-18 22:49

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх