使用 awk 中的 if else 语句基于现有列创建新列

使用 awk 中的 if else 语句基于现有列创建新列

我有一个包含 > 7 Mio 行(实际上 > 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

如果没有给出任何条件,则始终执行相应的 main。

答案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

相关内容