условный оператор awk для создания нового поля с аддитивным значением - PullRequest
0 голосов
/ 22 февраля 2019

Вопрос Как бы я использовал awk, чтобы создать новое поле с постоянным значением $ 2 +?Я планирую циклически просматривать список значений, но я не возражаю, используя одну строку для каждой команды

Псевдокод

awk '$1 == Bob {$4 = $2 + 400}' file

Пример данных

Philip  13  2
Bob  152   8
Bob  4561  2
Bob  234  36
Bob  98  12
Rey  147  152
Rey  15   1547

Ожидаемый результат

Philip  13  2
Bob  152   8  408
Bob  4561  2  402
Bob  234  36  436
Bob  98  12   412
Rey  147  152
Rey  15   1547

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

просто укажите Боб, также вы хотите добавить третье поле, а не второе

$ awk '$1=="Bob" {$4=$3+400}1' file | column -t

Philip  13    2
Bob     152   8     408
Bob     4561  2     402
Bob     234   36    436
Bob     98    12    412
Rey     147   152
Rey     15    1547
0 голосов
/ 23 февраля 2019

1-е решение: Не могли бы вы попробовать тоже один раз.Я использую здесь NF и NF+1 awk из коробки переменных.Где $NF обозначает значение последнего столбца текущей строки, а $(NF+1) создаст дополнительный столбец, если найдено условие st field string Bob`, ИСТИНА.

awk '{$(NF+1)=$1=="Bob"?400+$NF:""} 1' OFS="\t" Input_file

2-е решение: Если мы не хотим создавать новое поле и просто хотим напечатать значения в соответствии с условием, тогда попробуйте выполнить следующее,Я полагаю, что это должно быть быстрее.

awk 'BEGIN{OFS="\t"}{$1=$1;print $0,$1=="Bob"?400+$NF:""}' Input_file

Вывод будет следующим:

Philip  13      2   
Bob     152     8      408
Bob     4561    2      402
Bob     234     36     436
Bob     98      12     412
Rey     147     152 
Rey     15      1547

Объяснение: Добавление пояснения к вышекод сейчас.

awk '                                 ##Starting awk program here.
{
  $(NF+1)=$1=="Bob"?400+$NF:""        ##Creating a new last field here whose value will be depending upon condition check.
                                      ##its checking condition if 1st field is having Bob string in it then add 400 value to last field value or make it NULL.
}
1                                     ##awk works on method of condition then action. so by mentioning 1 making condition TRUE here and NO action defined so by default print of current line will happen.
' OFS="\t"  Input_file                ##Setting OFS as TAB here where OFS ois output field separator and mentioning Input_file name here.
0 голосов
/ 22 февраля 2019

Здесь проверьте, равен ли $1 Бобу, и восстановите запись ($0), добавив $2 FS 400 в $0.Здесь FS - разделитель полей, используемый между 3-м и 4-м полями.1 в конце означает, что скажите awk, чтобы выполнить действие по умолчанию - print.

awk '$1=="Bob"{$0=$0 FS $2 + 400}1' file
Philip  13  2
Bob  152   8 552
Bob  4561  2 4961
Bob  234  36 634
Bob  98  12 498
Rey  147  152
Rey  15   1547

Или, если вы хотите сохранить имя (Боб) в качестве переменной

awk -vname="Bob" '$1==name{$0=$0 FS $2 + 400}1' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...