У меня есть файл, который выглядит так:
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 печатать вторую строку?
$ 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
Похоже, вы просто хотите добавить ENDFILE{print ""}
, если у вас есть GNU awk, НО вы не можете публиковать форматированный текст в комментарии, поэтому я не уверен, о чем вы спрашиваете (в частности, я понятия не имею, как написать «пакетный файл» — звучит как Windows-y!) и вопросы-хамелеоны не приветствуются, поэтому, пожалуйста, задайте новый вопрос с собственным образцом ввода/вывода, если это не то, что вам нужно.
Если бы я запускал это как пакетный файл для нескольких входных файлов, как бы я заставил его вставлять новую строку между каждым выходом? Если я запускаю 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 Он разбивает столбец после каждой строки, когда я хочу, чтобы все это было в одном столбце.