awk сохраняет значение столбца 0, когда два столбца имеют значение 0 - PullRequest
0 голосов
/ 23 января 2020

У меня есть файл infile.txt с несколькими столбцами и строками, подобными этому:

infile.txt

2020  01  13  00  28.5833  77.2000  979  0        282.6  284.3  285.4  0     0
2020  01  13  00  28.5833  77.2000  925  469.578  290.4  296.9  297.7  3.6   5.1
2020  01  13  00  28.5833  77.2000  909  613.987  290.8  298.8  299.5  4.7   3.3
2020  01  13  00  28.5833  77.2000  850  1169.4   288    301.6  303.1  9.3   0
2020  01  13  00  28.5833  77.2000  700  2776.28  279    308.9  309.6  0     7.1
2020  01  13  00  28.5833  77.2000  500  5561.01  258.1  314.6  314.8  14.2  11.9

, и я хочу выполнить некоторые вычисления на основе столбцов следующим образом:

awk '{R=0; if($12) R=(('$g'/'$theta_vs')*($11-'$theta_vs')*($8-'$z_s'))/(($12^2)+($13^2)); print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,R }' > test.txt

Это прекрасно работает и сохраняет R = 0, когда $ 12! = 0, но обеспечивает выходное значение 0, когда $ 12 == 0 следующим образом:

outputfile:

2020  01  13  00  28.5833  77.2000  979  0        282.6  284.3  285.4  0     0     0
2020  01  13  00  28.5833  77.2000  925  469.578  290.4  296.9  297.7  3.6   5.1   5.08926
2020  01  13  00  28.5833  77.2000  909  613.987  290.8  298.8  299.5  4.7   3.3   9.01363
2020  01  13  00  28.5833  77.2000  850  1169.4   288    301.6  303.1  9.3   0     8.21755
2020  01  13  00  28.5833  77.2000  700  2776.28  279    308.9  309.6  0     7.1   0
2020  01  13  00  28.5833  77.2000  500  5561.01  258.1  314.6  314.8  14.2  11.9  16.3555

Я хочу сохранить R = 0, когда оба $ 12 && $ 13 равны 0.

Как мне это сделать?

Спасибо

Ответы [ 2 ]

4 голосов
/ 23 января 2020

Изменить

if ($12)

на

if ($12 || $13)

Это назначит R, если любой из них не равен нулю, и оставит его на 0, если оба они ноль.

4 голосов
/ 23 января 2020

Не могли бы вы попробовать следующее.

awk -v G="$g" -v theta="$theta_vs" -v z="$z_s" '{R=0; if($12 || $13) R=((G/theta)*($11-theta)*($8-z))/(($12^2)+($13^2)); print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,R }' Input_file

Если в ваших строках есть только 13 полей, то, согласно предложению Эд сэра, добавьте следующее.

awk -v G="$g" -v theta="$theta_vs" -v z="$z_s" '{R=0; if($12 || $13) R=((G/theta)*($11-theta)*($8-z))/(($12^2)+($13^2)); print $0,R }' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...