awk - запись значений из файла - PullRequest
0 голосов
/ 30 декабря 2018

Как написать в awk скрипт, который будет записывать 10 значений из входного файла plase?Спасибо.

Я пробовал это:

BEGIN
$2 == 0 && $3 == 2  { print $7}
$2 == 0 && $3 == 4  { print $7}
$2 == 0 && $3 == 5  { print $7}
$2 == 2 && $3 == 2  { print $7}
$2 == 2 && $3 == 4  { print $7}
$2 == 2 && $3 == 5  { print $7}
$2 == 3 && $3 == 2  { print $7}
$2 == 3 && $3 == 4  { print $7}
$2 == 3 && $3 == 5  { print $7}
$1 == "achil" { print $3}

Должен ли я написать все в один ряд?Когда необходимо писать BEGIN в коде, а когда нет?

Входной файл:

 achil           1   197524.72437205614        197524.72437205614       0.43066284286002637     

o 0  1 0 1 1      5.732821000     
o 0  2 0 1 1  54002.804084586     
o 0  3 0 1 1      0.088300000    
o 0  4 0 1 1    150.924210421    
o 0  5 0 1 1    108.520740945     
o 0  6 0 1 1      0.380000000    
o 0  7 0 1 1      0.004220000    
o 0  8 0 1 1      0.000000000     
o 0  9 0 1 1      0.000000000    
o 0 10 0 1 1      0.000000000     
o 0 11 0 1 1      0.000000000     

o 2  1 0 1 1  73413.000000000     
o 2  2 0 1 1  36176.166543543     
o 2  3 0 1 1      0.560000000    
o 2  4 0 1 1    229.480202654     
o 2  5 0 1 1      7.032947038     
o 2  6 0 1 1      0.480000000     
o 2  7 0 1 1      0.000000000     
o 2  8 0 1 1      0.000000000     
o 2  9 0 1 1      0.000000000     
o 2 10 0 1 1      0.000000000    
o 2 11 0 1 1      0.000000000     

o 3  1 0 1 1    365.256360000     
o 3  2 0 1 1  51550.294729034     
o 3  3 0 1 1      0.016710220     
o 3  4 0 1 1    299.430719769    
o 3  5 0 1 1      0.001070537    
o 3  6 0 1 1      0.000036626    
o 3  7 0 1 1      0.000009111    
o 3  8 0 1 1      0.000000000    
o 3  9 0 1 1      0.000000000     
o 3 10 0 1 1      0.000000000    
o 3 11 0 1 1      0.000000000     

Я хотел бы получить вывод, состоящий из этих 10 чисел:

197524.72437205614
54002.804084586
150.924210421
108.520740945
36176.166543543
229.480202654
7.032947038
51550.294729034
299.430719769
0.001070537

1 Ответ

0 голосов
/ 30 декабря 2018

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

BEGIN { print "my-title-string-in-double quotes" } 

Запись его одной или несколькими строками - это вопрос стиля и того, как вы выглядитеаккуратный и хорошо читаемый.Поэтому все, что вам нужно сделать сейчас, это определить awk сценарий с содержимым как

#!/usr/bin/awk -f

$2 == 0 && $3 == 2  { print $7}
$2 == 0 && $3 == 4  { print $7}
$2 == 0 && $3 == 5  { print $7}
$2 == 2 && $3 == 2  { print $7}
$2 == 2 && $3 == 4  { print $7}
$2 == 2 && $3 == 5  { print $7}
$2 == 3 && $3 == 2  { print $7}
$2 == 3 && $3 == 4  { print $7}
$2 == 3 && $3 == 5  { print $7}
$1 == "achil"       { print $3}

Добавить разрешения на выполнение для него

chmod +x script.awk

и запустить его как

awk -f script.awk input-file

Но, тем не менее, ваши условия вполне могут быть записаны с использованием операторов сопоставления с шаблоном как

$2 ~ /^(0|2|3)$/ && $3 ~ /^(2|4|5)$/ { print $7; next } $1 == "achil" { print $3 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...