快速的问题,我试图检查我的逗号分隔的CSV文件/数据中的某些模式,我需要和运算符&&。我选择与AWK合作。
尝试的命令:
1.
cat file | awk -F "," 'BEGIN{ OFS=FS=","}
{if (($1="DIFF" && $2="DIFF" && $3="NODIFF"))
$(NF+1)="TRUE";
else $(NF+1)="FALSE";
print
}' > outfile
二:
cat file | awk -F "," 'BEGIN{ OFS=FS=","}
{if (($1="DIFF" && $2="DIFF" && $3="NODIFF"))
$(NF+1)="TRUE";
else if (!($1="DIFF" && $2="DIFF" && $3="NODIFF"))
$(NF+1)="FALSE";print
}' > outfile
输入:
DIFF,DIFF,NODIFF
DIFF,NODIFF,DIFF
DIFF,DIFF,DIFF
NODIFF,DIFF,DIFF
所需输出:
DIFF,DIFF,NODIFF,TRUE
DIFF,NODIFF,DIFF,FALSE
DIFF,DIFF,DIFF,FALSE
NODIFF,DIFF,DIFF,FALSE
然而,这是我得到的输出,我不知道如何阻止AWK这样做??
1,1,NODIFF,TRUE
1,1,NODIFF,TRUE
1,1,NODIFF,TRUE
1,1,NODIFF,TRUE
我以为这是一个简单的方法,但显然我错过了一些东西。
感谢您的任何想法/建议,
2条答案
按热度按时间w8rqjzmb1#
$1="DIFF"
是一个赋值操作。比较运算符为
==
;尝试$1=="DIFF"
、$2=="DIFF"
和$3=="NODIFF"
至于如何生成一对
1's
...awk
在解析它认为看起来像$1=("DIFF" && $2="DIFF")
的赋值时遇到问题1
),因此$1=("DIFF" && $2="DIFF")
变为$1=("DIFF" && 1)
1
),所以$1=("DIFF" && 1)
变成$1=(1 && 1)
,而$1=(1 && 1)
又变成$1=1
$2=("DIFF" && $3="NODIFF")
重复$3="NODIFF"
是一个更直接、更简单的赋值1,1,NODIFF
开头jxct1oxe2#
当你有文件时你不需要
cat
,GNUAWK
可以自己读取。您试图同时使用-F
设置字段分隔符,并在BEGIN
中设置FS
的值,严格来说这不是错误,但这是多余的。您将=
(赋值)与==
(相等检查)混合,导致故障。在这种情况下,您可能只使用一个正则表达式就可以完成任务,下面的方法如下:
然后
给出输出
说明:我告诉GNU
AWK
,既是字段分隔符,也是输出字段分隔符,然后我将下一个字段设置为TRUE
,如果行以(^
)DIFF,DIFF,NODIFF
开始,则使用所谓的三元运算符条件?
valueiftrue:
valueiffalse,然后print
行。