csv 为什么awk中的and &&运算符最终会改变我的输入文件中的值?

rt4zxlrg  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(103)

快速的问题,我试图检查我的逗号分隔的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

我以为这是一个简单的方法,但显然我错过了一些东西。
感谢您的任何想法/建议,

w8rqjzmb

w8rqjzmb1#

$1="DIFF"是一个赋值操作。
比较运算符为==;尝试$1=="DIFF"$2=="DIFF"$3=="NODIFF"
至于如何生成一对1's...

  • awk在解析它认为看起来像$1=("DIFF" && $2="DIFF")的赋值时遇到问题
  • 赋值被认为是“true”(又名1),因此$1=("DIFF" && $2="DIFF")变为$1=("DIFF" && 1)
  • 一个文字字符串本身被认为是'true'(又名1),所以$1=("DIFF" && 1)变成$1=(1 && 1),而$1=(1 && 1)又变成$1=1
  • $2=("DIFF" && $3="NODIFF")重复
  • 显然,$3="NODIFF"是一个更直接、更简单的赋值
  • 最终结果:所有输出行都以1,1,NODIFF开头
jxct1oxe

jxct1oxe2#

当你有文件时你不需要cat,GNU AWK可以自己读取。您试图同时使用-F设置字段分隔符,并在BEGIN中设置FS的值,严格来说这不是错误,但这是多余的。您将=(赋值)与==(相等检查)混合,导致故障。
在这种情况下,您可能只使用一个正则表达式就可以完成任务,下面的方法如下:

DIFF,DIFF,NODIFF
DIFF,NODIFF,DIFF
DIFF,DIFF,DIFF
NODIFF,DIFF,DIFF

然后

awk 'BEGIN{FS=OFS=","}{$(NF+1)=/^DIFF,DIFF,NODIFF/?"TRUE":"FALSE";print}' file.txt

给出输出

DIFF,DIFF,NODIFF,TRUE
DIFF,NODIFF,DIFF,FALSE
DIFF,DIFF,DIFF,FALSE
NODIFF,DIFF,DIFF,FALSE

说明:我告诉GNU AWK,既是字段分隔符,也是输出字段分隔符,然后我将下一个字段设置为TRUE,如果行以(^DIFF,DIFF,NODIFF开始,则使用所谓的三元运算符条件? valueiftrue : valueiffalse,然后print行。

  • (在GNU Awk 5.1.0中测试)*

相关问题