3

У меня есть файл 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, но без удачи я также попробовал tail, но количество строк неизвестно до тех пор, пока файл не будет прочитан.

2 ответа2

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 , установите 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) обратно, чтобы обозначить a .

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

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .