awk: сопоставлять поля и вставлять постоянные значения в матрицу - PullRequest
0 голосов
/ 03 июля 2018

Я хотел бы манипулировать двумя файлами (t.dat и b.dat) с помощью awk. Я добился некоторого прогресса, но теперь у меня есть шаг 5, на котором я хочу сопоставить 1, 2 доллара с 4 шага (tempb_a2.dat) с b.dat и записать 3 доллара с 4 шага в b.dat, чтобы получить out.dat. Это мой код:

    awk '!($3 <= -2000)' OFS="\t" t.dat > t_a2.dat      # step1
    awk '$3 >= -2000 {$3="100000"}1' t.dat > t_b2.dat   # step2
    awk 'FNR==NR {a[$1,$2]; next} ($1,$2) in a'  t_a2.dat b.dat > b_a2.dat  # step3
    awk '$3 > 0 {$3="100000"}1' b_a2.dat > tempb_a2.dat # ste4
                                    # step5: match $1,$2 of step4 with b.dat and replace $3 of b.dat with constant values
==> tempb_a2.dat <==
3173.31022404 0.999881782111 100000
3175.31041958 0.999881782111 100000
3176.31051735 0.999881782111 100000
3177.31061512 0.999881782111 100000
3179.31081066 0.999881782111 100000
3180.31090843 0.999881782111 100000
3182.31110397 0.999881782111 100000

==> b.dat <==
3173.31022404 0.999881782111 485.86
3174.31032181 0.999881782111 486.74
3175.31041958 0.999881782111 487.45
3176.31051735 0.999881782111 487.97
3177.31061512 0.999881782111 488.29
3178.31071289 0.999881782111 488.39
3179.31081066 0.999881782111 488.25
3180.31090843 0.999881782111 487.82
3181.3110062 0.999881782111 487.06
3182.31110397 0.999881782111 486.13

==> out.dat <==
3173.31022404 0.999881782111 100000
3174.31032181 0.999881782111 486.74
3175.31041958 0.999881782111 100000
3176.31051735 0.999881782111 100000
3177.31061512 0.999881782111 100000
3178.31071289 0.999881782111 488.39
3179.31081066 0.999881782111 100000
3180.31090843 0.999881782111 100000
3181.3110062 0.999881782111 487.06
3182.31110397 0.999881782111 100000

========================================
==> t.dat <==
3173.31022404 0.999881782111 -1832.86
3174.31032181 0.999881782111 -4097.18
3175.31041958 0.999881782111 -297.84
3176.31051735 0.999881782111 NaN
3177.31061512 0.999881782111 -1926.67
3178.31071289 0.999881782111 -4927.53
3179.31081066 0.999881782111 NaN
3180.31090843 0.999881782111 -1900.99
3181.3110062 0.999881782111 -4174.76
3182.31110397 0.999881782111 -1041.73

1 Ответ

0 голосов
/ 03 июля 2018

РЕДАКТИРОВАТЬ: ОП задает 2-й вопрос о 2 файлах, поэтому добавим его тоже сейчас.

awk 'FNR==NR{a[$1,$2]=$NF;next} {print $1,$2,a[$1,$2]?a[$1,$2]:$NF}' tempb_a2.dat b.dat > out.dat

Согласно вашему комментарию, вам нужно изменить те последние поля, значения которых либо NaN, либо больше -2000, если это так, то следующее может помочь вам.

awk '$NF=="NaN" || $NF>-2000{$NF=100000} 1' t.dat

Пояснение:

$NF=="NaN" || $NF>-2000: здесь проверяется условие, если последнее поле ($ NF) имеет строку NaN или больше -2000, затем выполните следующее.

$NF=100000: присвоение значения последнего поля 100000 для текущей строки.

1: упоминая здесь 1, awk работает с методом condition, а затем action, поэтому, упомянув 1, поставьте условие ИСТИНА и не упомянув о каком-либо действии, так что по умолчанию произойдет печать текущей строки .

Input_file: здесь упоминается имя файла Input_file, через которое нам нужно перейти к awk.

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