Как заставить awk работать только после определенных заголовков? - PullRequest
3 голосов
/ 04 декабря 2011

У меня есть файл с таблицами значений под определенными заголовками.Вот так:

Series A
a 01 20
b 21 43
c 44 59
d 60 72

Series B
a 01 25
b 26 48
c 49 70
d 71 90

Мой вопрос: как я могу заставить awk извлекать информацию только из указанной серии?Так что, если awk скажут взглянуть на столбец 2 «Series B», он выведет этот столбец.

Ответы [ 3 ]

2 голосов
/ 05 декабря 2011

Если данные разделены пустой строкой, вы можете использовать что-то вроде этого -

[jaypal:~/Temp] cat file
Series A
a 01 20
b 21 43
c 44 59
d 60 72

Series B
a 01 25
b 26 48
c 49 70
d 71 90
[jaypal:~/Temp] awk '/Series B/,/^$/ { if (NF==3) print $2 }' file
01
26
49
71

Или вы можете сделать что-то подобное в sed:

[jaypal:~/Temp] sed -n '/Series B/,/^$/s/\(.*[^ ]\) \(.*[^ ]\) \(.*\)/\2/p' file
01
26
49
71
1 голос
/ 05 декабря 2011

При условии, что таблицы разделены пустой строкой (ами):

awk '$0 ~ p, !NF {
  if (!($0 ~ p) && NF) print $c
  }' p='Series B' c=2 infile

$0 ~ p, !NF - пара шаблонов, разделенных запятой, задает диапазон записей. Первый оценивается как true, если текущая запись $ 0 соответствует шаблону, указанному значение переменной р. Второе верно, когда значение NF (Количество полей) 0 (пустая или пустая строка).

if (!($0 ~ p) && NF) print $c - если текущая запись не соответствует шаблону p (т.е. пропустить заголовок) и (&&) текущая запись содержит хотя бы один столбец (NF != 0) напечатайте нужный столбец.

0 голосов
/ 05 декабря 2011

Я предпочитаю так:

awk -v sect="$1" -v col="$2" '
/Series/ {header = $0; next}
NF > 1 {
    set[header] = set[header]$col"|";
}
END {print set[sect];}
' $3 | tr '|' '\n'

Я ввел ассоциированный массив и временный разделитель (не требуется, если вам не нужна сортировка по «Серии», просто используйте «\ n» и опустите tr), не полагайтесь на пустую строку, используйте «|» в качестве временного септа используйте tr, чтобы передать его обратно.

Это мое общее решение, так как в реальной жизни я могу создать собственную «сортировочную колонку», затем направить ее в сортировку unix и обрезать их. Nawk (увы, AIX) не имеет сортировки, а сортировка unix намного лучше, чем любая ручная сортировка в awk.

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