Как заставить awk печатать поля из второй строки файла?

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

   measured      10.8       0.0000    0.0000    0.0236    0.0304    0.0383    0.0433    0.0437    0.0442    0.0452
                            0.0455    0.0448    0.0440    0.0423    0.0386    0.0344    0.0274    0.0000    0.0000

Я хочу, чтобы gawk выводил все числа в один длинный столбец, например:

0.0000
0.0000
0.0236
0.0304
0.0383
0.0433
0.0437
0.0442
0.0452
0.0455
0.0448
0.0440
0.0423
0.0386
0.0344
0.0274
0.0000
0.0000

Я запускаю команду gawk '/measured/ { printf $3"\n" $4"\n" $5"\n" $6"\n" $7"\n" $8"\n" $9"\n" $10"\n" $11"\n" $12"\n" $13"\n" $14"\n" $15"\n" $16"\n" $17"\n" $18"\n" }' filename.txt

Но я просто получаю первую строку чисел:

0.0000
0.0000
0.0236
0.0304
0.0383
0.0433
0.0437
0.0442
0.0452

Как заставить gawk печатать вторую строку?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
195
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

$ grep -A1 measured file | tr -s ' ' \\n | tail -n+4

0.0000
0.0000
0.0236
0.0304
0.0383
0.0433
0.0437
0.0442
0.0452
0.0455
0.0448
0.0440
0.0423
0.0386
0.0344
0.0274
0.0000
0.0000

с awk

$ awk -v OFS='\n' '/measured/ {p=1; for(i=3;i<=NF;i++) print $i; next}
                            p {$1=$1; print; exit}' file

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

awk '{for(i=NF-8;i<=NF;i++){print $i}}' input.file

Реализация GNU Awk допускает произвольное регулярное выражение в качестве разделителя записей RS. Если ключевое слово measured встречается перед каждым набором чисел, мы можем использовать это ключевое слово в качестве разделителя:

$ gawk 'BEGIN { RS = "measured" } { for (i = 1; i <= NF ; i++) print "field " i " = " $i }'
   measured      10.8       0.0000    0.0000    0.0236    0.0304    0.0383    0.0433    0.0437    0.0442    0.0452
                            0.0455    0.0448    0.0440    0.0423    0.0386    0.0344    0.0274    0.0000    0.000

field 1 = 10.8
field 2 = 0.0000
field 3 = 0.0000
field 4 = 0.0236
field 5 = 0.0304
field 6 = 0.0383
field 7 = 0.0433
field 8 = 0.0437
field 9 = 0.0442
field 10 = 0.0452
field 11 = 0.0455
field 12 = 0.0448
field 13 = 0.0440
field 14 = 0.0423
field 15 = 0.0386
field 16 = 0.0344
field 17 = 0.0274
field 18 = 0.0000
field 19 = 0.000

Как видите, все поля между разделителями записей measured анализируются независимо от разрывов строк. Поля разделены любым сочетанием пробелов, табуляций и новых строк.

Обратите внимание: поскольку measured появляется первым, мы получаем пустую запись. Вывод, который вы видите выше, фактически получен из второй записи. Первая запись — это whitespcae перед measured, которая не содержит полей.

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

Ответ принят как подходящий
$ cat tst.awk
BEGIN { OFS = "\n" }
/measured/ { c=2; $1=$2 = ""; $0=$0 }
c && c-- { $1=$1; print }

$ awk -f tst.awk file
0.0000
0.0000
0.0236
0.0304
0.0383
0.0433
0.0437
0.0442
0.0452
0.0455
0.0448
0.0440
0.0423
0.0386
0.0344
0.0274
0.0000
0.0000

Если бы я запускал это как пакетный файл для нескольких входных файлов, как бы я заставил его вставлять новую строку между каждым выходом? Если я запускаю BEGIN { OFS = "\n" } /measured/ { c=2; $1=$2 = ""; $0=$0 } c && c-- { $1=$1; print } {print "\n"} В итоге я получаю: 0,0000 0,0000 0,1125 0,1440 0,1799 0,2024 0,2037 0,2062 0,2103 0,2115 0,2082 0,2046 0,1970 0,1803 0,1615 0 .1297 0,0000 0,0000 Он разбивает столбец после каждой строки, когда я хочу, чтобы все это было в одном столбце.

Joe Blough 14.12.2020 23:43

Похоже, вы просто хотите добавить ENDFILE{print ""}, если у вас есть GNU awk, НО вы не можете публиковать форматированный текст в комментарии, поэтому я не уверен, о чем вы спрашиваете (в частности, я понятия не имею, как написать «пакетный файл» — звучит как Windows-y!) и вопросы-хамелеоны не приветствуются, поэтому, пожалуйста, задайте новый вопрос с собственным образцом ввода/вывода, если это не то, что вам нужно.

Ed Morton 15.12.2020 16:52

Другие вопросы по теме