If statement AWK if-then循环以列值为条件

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

我有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, $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