подсчет непустых строк на блок файла, имеющих несколько блоков, разделенных пустой строкой - PullRequest
0 голосов
/ 12 февраля 2010

Я бы хотел посчитать строки в файле, который состоит из нескольких блоков, скажем, 3, каждый из которых имеет разное количество строк. Каждый блок отделен пустой строкой. Есть ли однострочное решение? Пока вот что у меня есть:

awk '(NR> 4) && NF! = 0 {++ count} END {print count}' filename> outfile

Это, очевидно, подсчитывает все непустые строки (и избавляется от 4-строчного заголовка). Теперь я должен включить цикл for и после каждого запуска выводить количество строк.

Таким образом, если у меня есть 100 непустых строк, а первый блок содержит 20 строк, второй 50 и третий 30 строк, идеальный результат будет 20 50 30

Все мои усилия до сих пор имели синтаксические ошибки.

Спасибо за вашу помощь Том

Ответы [ 4 ]

1 голос
/ 12 февраля 2010
awk 'NR>4 {if ($0 ~ /./ ) { mylines=mylines+1 } else { printf("%d ",mylines) ; mylines=0 } }
      END { if ($0 ~ /./) { printf("%d ",mylines) } }' <FILENAME>

сделает это.

Примечание : я использую printf, потому что вы указали вывод "20 50 30", который находится в одной строке.

Редактировать : только что распознан, мы должны пропустить первые 4 строки.

0 голосов
/ 12 февраля 2010

Вот версия моего файла: Начинается с пустой строки:

#Surface 0 of 1 surfaces

# Contour 0, label:    0.138
 462  370.107  0.137889 
 461.82  370  0.137889 
skipping lines
 463  370.529  0.137889 
 462  370.107  0.137889 

 570  448.082  0.137889 
 569.772  448  0.137889 
skipping lines
 571  448.272  0.137889 
 570  448.082  0.137889 

 569  465.332  0.137889 
 568.299  465  0.137889 
skipping lines
 570  465.554  0.137889 
 569  465.332  0.137889 

Да, в конце есть пустая строка

THX

0 голосов
/ 12 февраля 2010

awk 'BEGIN{count=0}\
        { if(NF==0) {if(NR>4)print count;count=0} \
          else count++ ;}' test.txt
0 голосов
/ 12 февраля 2010

если я правильно вас понял (в следующий раз покажите примеры)

$ cat file
#Surface 0 of 1 surfaces

# Contour 0, label:    0.138
 462  370.107  0.137889
 461.82  370  0.137889
skipping lines
 463  370.529  0.137889
 462  370.107  0.137889

 570  448.082  0.137889
 569.772  448  0.137889
skipping lines
 571  448.272  0.137889
 570  448.082  0.137889

 569  465.332  0.137889
 568.299  465  0.137889
skipping lines
 570  465.554  0.137889
 569  465.332  0.137889

$ awk 'NR==3{ RS=""; FS="\n"}NR>3{print NF}' file
5
5
5

Таким образом, в основном, в записи 3 непосредственно перед достижением записи 4 установите разделитель записей в пустое значение и разделитель полей в новые строки.Это потому, что мы не хотим касаться переменных RS и FS для строк заголовка.После 3-й строки нам нужно изменить RS и FS, чтобы получить желаемый результат.то есть запись заканчивается пустой строкой, а все поля разделены новыми строками "\ n", по сути, подсчет NF даст нам общее количество строк в одной записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...