If statement AWK if-then循环以列值为条件
我有3列,我想创建一个第4列,只有当第3列等于1时才等于第2列(否则,值可以为0) 例如,If statement AWK if-then循环以列值为条件,if-statement,awk,If Statement,Awk,我有3列,我想创建一个第4列,只有当第3列等于1时才等于第2列(否则,值可以为0) 例如, 431 将成为 4313 鉴于 432 将成为 4320 我尝试了3种方法,在所有情况下,第4列都是零: 'BEGIN {FS = "\t"}; {if ($3!=1) last=0; else last=$2} {print $1, $2, $3, last}' 'BEGIN {FS = "\t"}; {if ($3!=1) print $1, $2, $3, 0; else print $1, $2
431
将成为
4313
鉴于
432
将成为
4320
我尝试了3种方法,在所有情况下,第4列都是零:
'BEGIN {FS = "\t"}; {if ($3!=1) last=0; else last=$2} {print $1, $2, $3, last}'
'BEGIN {FS = "\t"}; {if ($3!=1) print $1, $2, $3, 0; else print $1, $2, $3, $2}'
'BEGIN {FS = "\t"}; {if ($3==1) print $1, $2, $3, $2; else print $1, $2, $3, 0}'
救命啊
awk '{$(NF+1)=$3==1?$2:0}1'
救命啊
awk '{$(NF+1)=$3==1?$2:0}1'
最后一个对我来说很好。你看到了什么输出?(您不需要在BEGIN块之后使用
;
,但它仍然可以工作。)事实上,这三种方法都适用于我。你是怎么运作的?你能用你正在使用的确切命令和你看到的输出显示一个不适合你的小文件吗?或者一个更好的问题:你确定数据是用制表符分隔的吗?对于*pp1.txt中的i;不要重复$i;awk-F,'BEGIN{FS=“\t”};{如果($3==1)打印$1,$2,$3,$2;否则打印$1,$2,$3,0}'$i>${i%1.txt}2.txt;完成此操作的文件有:7.89947 0 6401 7.89795 0 6402 7.90405 0 6403 7.90253 2 1 7.901 2 7.89642 2 3第4列的输出均为零。您是对的,问题是它不是以制表符分隔的文件,谢谢!请阅读Arnold Robbins的《有效的Awk编程》第四版的前几章,因为你不理解基本的Awk语法。最后一章对我来说很好。你看到了什么输出?(您不需要在BEGIN块之后使用;
,但它仍然可以工作。)事实上,这三种方法都适用于我。你是怎么运作的?你能用你正在使用的确切命令和你看到的输出显示一个不适合你的小文件吗?或者一个更好的问题:你确定数据是用制表符分隔的吗?对于*pp1.txt中的i;不要重复$i;awk-F,'BEGIN{FS=“\t”};{如果($3==1)打印$1,$2,$3,$2;否则打印$1,$2,$3,0}'$i>${i%1.txt}2.txt;完成此操作的文件有:7.89947 0 6401 7.89795 0 6402 7.90405 0 6403 7.90253 2 1 7.901 2 7.89642 2 3第4列的输出均为零。您是对的,问题是它不是以制表符分隔的文件,谢谢!请阅读Arnold Robbins的《有效的Awk编程》第四版的前几章,因为您不理解基本的Awk语法。对于非呆滞的Awk,您需要在三元运算符周围使用括号。@iiSeymour It,至少与nawk
,mawk
,plan9[port]的Awk
一起使用,和gawk
。只有某些上下文中的一些awk会因未细化的三元表达式而失败(语法错误)。例如,在OSX awk上尝试print1>2?3:4
(我认为这是失败案例之一)。因此,这个特定表达式可能适用于所有AWK或其中的一些AWK,但为了便于移植到其他AWK,您应该始终将三元表达式括起来,更重要的是,为了可读性,三元表达式很难读取,而不会嵌入较长的表达式中。@EdMorton该表达式的行为符合标准语法的定义,其中print
和printf
在调用时不带括号,使用一组简化的表达式。简化语法包括赋值和三元表达式,但不包括整数比较。这可能是为了轻松区分打印参数和输出重定向gawk
的失败方式与nawk
类似,mawk
创建一个名为3
的文件,其中包含1
。对于非gawk的awk,您需要在三元运算符周围使用括号。@Iisemour It,至少与nawk
,mawk
,plan9[port]的awk一起工作,和gawk
。只有某些上下文中的一些awk会因未细化的三元表达式而失败(语法错误)。例如,在OSX awk上尝试print1>2?3:4
(我认为这是失败案例之一)。因此,这个特定表达式可能适用于所有AWK或其中的一些AWK,但为了便于移植到其他AWK,您应该始终将三元表达式括起来,更重要的是,为了可读性,三元表达式很难读取,而不会嵌入较长的表达式中。@EdMorton该表达式的行为符合标准语法的定义,其中print
和printf
在调用时不带括号,使用一组简化的表达式。简化语法包括赋值和三元表达式,但不包括整数比较。这可能是为了轻松区分打印参数和输出重定向gawk
的失败方式与nawk
类似,并且mawk
创建一个名为3
的文件,其中包含1
。