создать новый столбец на основе существующих столбцов с помощью оператора if else в awk

создать новый столбец на основе существующих столбцов с помощью оператора if else в awk

У меня есть набор данных с > 7 млн ​​строк (и на самом деле > 20 столбцов), и я хотел бы создать новый столбец (в моем примере набора данных 5 столбцов), поэтому это будет номер 6. У моего набора данных есть заголовок.

Условия должны быть следующими: если значение столбца 1 больше значения столбца 3, то новый столбец должен иметь значение столбца 1; в противном случае он должен иметь значение «1 минус значение столбца 1».

Я попробовал это, но это не работает:

awk '{ if ($1 > $3) $6 == $1}; else $6 == 1-$1}' test.txt > test2.txt

Набор данных (пример):

col1 col2 col3 col4 col5
1 3 4 string string
4 2 1 string string

Для строки 1 col6 должен быть 1-1 = 0, для строки 2 col6 должен быть 4.

решение1

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

awk '{ if($1>$3) $6=$1; else $6=1-$1; print $0; } ' test01 > test02 

или:

awk '$1>$3{ $6=$1; print $0; } $1<$3{ $6=1-$1; print $0; }' test01 > test02 

Потому что awkработает так:

awk 'condition1{main1} condition2{main2} ... conditionN{mainN}' file.txt

если условия не заданы, всегда выполняется соответствующая основная функция.

решение2

Попробуйте это. Нужно было просто ==заменить =и добавить брекеты.

awk '{ if ($1 > $3){ $6=$1 }else{ $6=1-$1 } print }' test.txt >test2.txt

решение3

$ awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
             { $(NF+1) = $1      }
    $1 <= $3 { $NF     = 1 - $NF } 1' file
col1 col2 col3 col4 col5 newcol
1 3 4 string string 0
4 2 1 string string 4

Когда awkскрипт добавил и вывел новый заголовок столбца, он начинает вычислять значение нового столбца для других строк.

Значение вычисляется путем установки его на уровне значения в столбце 1, и если столбец 1 меньше или равен столбцу 3, оно вычитается из 1. Одиночный символ 1в конце приводит к печати измененной записи (строки).

Присвоение значения $(NF + 1)(«полю после последнего поля») добавит дополнительный столбец к текущей строке, а также увеличит NF(количество полей в текущей записи).

Очевидно, вы можете сделать это ifи с помощью явного оператора:

awk 'NR==1 { $0 = $0 OFS "newcol"; print; next }
    { if ($1 > $3) $(NF+1) = $1; else $(NF+1) = 1 - $1 } 1' file

Связанный контент