Как получить количество данных между двумя строками с несколькими вхождениями в одном файле

У меня есть данные в моем файле как

START-OF-FIELDS ID NAME DEPT END-OF-FIELDS START-OF-DATA 1|joy|cs 2|sam|ec END-OF-DATA START-OF-FIELDS ID NAME DOB DEPT ADDRESS END-OF-FIELDS START-OF-DATA 5|joe|13/2/2001/|ee|street1 3|gwen|4/08/1999|cs|street2 END-OF-DATA 

ОЖИДАЕМЫЙ ВЫХОД: –

 ID NAME DEPT 

Количество для набора данных 1: 3

 ID NAME DOB DEPT ADDRESS 

Счет для набора данных 2 равен: 5 и так далее для динамического номера. наборов данных.

Я хочу подсчитывать данные как между СТАРТ-ПОЛЯМИ И КОНЕЧНЫМИ ПОЛЯМИ, так и для ПУНКТА ДАННЫХ И КОНЕЦ ДАННЫХ. может ли любой орган дать мне точный код, чтобы сделать это. я использовал

 sed -n '/^START-OF-FIELDS/,/END-OF-FIELDS/{s/^START-OF-FIELDS//;/^END-OF-FIELDS/d;p;}' Sourcefile.txt > START_OF_FIELDS.TXT wc -l START_OF_FIELDS.TXT 

Но я не получаю желаемого результата.

4 Solutions collect form web for “Как получить количество данных между двумя строками с несколькими вхождениями в одном файле”

Учитывая новое лучшее описание проблемы, это на самом деле проще

 #!/bin/bash awk 'BEGIN { SETNR=0; MODE="Non-Fields"} (MODE=="Fields") && (! /START-OF-/ ) && (! /END-OF/ ) { print; COUNT++ } /START-OF-FIELDS/ { COUNT=0; SETNR++; MODE="Fields" } /END-OF/ { if (MODE=="Fields") { printf ("Count for data set %d is: %d\n", SETNR, COUNT) }; MODE="Non-Fields" }' $* 

Ваша проблема должна быть лучше определена, но, глядя на ваш образец ввода, я делаю догадки о том, что вы хотите сделать. Используйте небольшой AWK-скрипт следующим образом:

 #!/bin/bash awk '! /START-OF-/ { if (MODE=="DEFINE") { HEADER=HEADER $0 "|" } else if ((MODE=="DATA") && (NF>0)) { print } } /START-OF-FIELDS/ { MODE="DEFINE"; HEADER="" } /START-OF-DATA/ { print HEADER MODE="DATA" HEADER="" }' | sed 's/|$//' 

Это дает:

 ID|NAME|DEPT 1|joy|cs 2|sam|ec ID |NAME|DOB|DEPT|ADDRESS 5|joe|13/2/2001/|ee|street1 3|gwen|4/08/1999|cs|street2 

Примечание. Я ленив, поэтому добавляю вертикальную панель после каждого поля в заголовке. Затем я использую команду SED для последующего удаления конечных V-баров.

 sed -n '/^START-OF-DATA$/,/^$/{/^START-OF-DATA$/d;/^$/d;p;}' filename 

То есть:

  • Соберите строки между START-OF-DATA и следующей пустой строкой – /^START-OF-DATA$/,/^$/ . С этими линиями:
    • Удалить разделительные линии – /^START-OF-DATA$/d и /^$/d
    • Распечатайте остальные – p

Решение в awk :

 $ awk '/END-OF/{flag=0;printf "Count for data set %d is: %d\n",++i,count;count=0;printf "\n"} {if(flag){ count++; print; }} /START-OF/{flag=1}' file ID NAME DEPT Count for data set 1 is: 3 1|joy|cs 2|sam|ec Count for data set 2 is: 2 ID NAME DOB DEPT ADDRESS Count for data set 3 is: 5 5|joe|13/2/2001/|ee|street1 3|gwen|4/08/1999|cs|street2 Count for data set 4 is: 2 
  • Переменная окружения для ip-адреса
  • Shell scripting помогает текстовому файлу в массив
  • Сортировка файлов в папки, в зависимости от типа файла
  • Список файлов на основе даты и времени в имени файла
  • обрабатывать большое количество журналов с помощью cron или logrotate
  • Bash не равно сравнение строк
  • Получить номер строки в сценарии оболочки Bourne
  • Использование AWK для удаления результата линии и вывода
  • Поиск количества времени в определенном номере в файле, где также указан диапазон
  • `eval` работает на Ubuntu, но не работает на Debian и Kali
  • Сценарий оболочки для выполнения сценария оболочки для всех подкаталогов
  • Ошибка в простом скрипте bash - mv + awk
  • Interesting Posts

    Скриншот X от tty

    Включается ли обмен по умолчанию в общих операционных системах?

    Чтение пароля с клавиатуры вместо stdin

    Настенное сообщение предупредило о предстоящей перезагрузке или завершении работы, но я пропустил детали. Как я могу их получить?

    После установки нового диска в качестве домашнего раздела, где можно найти старые / домашние файлы?

    Как проверить, включена ли переадресация портов?

    Не удалось перезапустить xmonad на archlinux

    Инициативный скрипт оставляет тысячи неработающих процессов

    file / libmagic: Какова длина ID3?

    Загрузка KDE на Chromebook 14

    Может ли команда rsync запускаться с использованием нескольких процессоров?

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

    Процесс firefox умирает после выхода ssh на удаленную машину

    IMX28 – I2C – Не удалось отправить команду SELECT!

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

    Linux и Unix - лучшая ОС в мире.