Awk拆分字符串并进行比较

Awk拆分字符串并进行比较,awk,Awk,我有一个类似于AS | REQ | XYZ | value=12的字符串,我正在用它拆分: awk -F\| 'print {$4}' | awk -F"=" '{print $2}' 这将给出值12 但是对于字符串DF | REG | EXP | value=,它返回为空 如果字符串在第四列中遇到值且为空,则抛出错误。这可以在awk命令中完成吗 谢谢也许是这样的吧 awk -F\| '{print $4}' | awk -F"=" '{if ($2 == "") print "ERROR:

我有一个类似于
AS | REQ | XYZ | value=12的字符串,我正在用它拆分:

awk -F\| 'print {$4}' | awk -F"=" '{print $2}'
这将给出值12

但是对于字符串
DF | REG | EXP | value=
,它返回为空

如果字符串在第四列中遇到
值且为空,则抛出错误。这可以在awk命令中完成吗


谢谢

也许是这样的吧

awk -F\| '{print $4}' | awk -F"=" '{if ($2 == "") print "ERROR: Empty Value"; else print $2}'

也许是这样的

awk -F\| '{print $4}' | awk -F"=" '{if ($2 == "") print "ERROR: Empty Value"; else print $2}'

您可以更具体地说明抛出错误的含义。如果希望程序以非零退出代码退出,请使用
If
exit
值`:

$ awk 'BEGIN{exit}'
$ echo $?
0
$ awk 'BEGIN{exit 1}'
$ echo $?
1
$ awk -F\| '{split($4,a,"="); if(a[2]=="") exit 1; else print a[2]}' foo
12
$ echo $?
1
或者只打印一条错误消息并继续执行:

$ awk -F\| '{split($4,a,"="); print (a[2]==""?"ERROR":a[2])}' foo
12
ERROR
上述使用的测试数据:

$ cat foo
AS|REQ|XYZ|value=12
DF|REG|EXP|value=

您可以更具体地说明抛出错误的含义。如果希望程序以非零退出代码退出,请使用
If
exit
值`:

$ awk 'BEGIN{exit}'
$ echo $?
0
$ awk 'BEGIN{exit 1}'
$ echo $?
1
$ awk -F\| '{split($4,a,"="); if(a[2]=="") exit 1; else print a[2]}' foo
12
$ echo $?
1
或者只打印一条错误消息并继续执行:

$ awk -F\| '{split($4,a,"="); print (a[2]==""?"ERROR":a[2])}' foo
12
ERROR
上述使用的测试数据:

$ cat foo
AS|REQ|XYZ|value=12
DF|REG|EXP|value=

希望这个命令对你有用。下面的命令将按预期运行。如果值字段中有任何值,它将只打印该值。否则,如果为空,则打印“错误”。字符串被放置在test.txt中

awk -F\| '{if($4!="value=") {gsub("value=","",$4);print $4} else print "error" }' test.txt

希望这个命令对你有用。下面的命令将按预期运行。如果值字段中有任何值,它将只打印该值。否则,如果为空,则打印“错误”。字符串被放置在test.txt中

awk -F\| '{if($4!="value=") {gsub("value=","",$4);print $4} else print "error" }' test.txt
类似这样的事情-

cat f
AS|REQ|XYZ|value=12
AS|REQ|XYZ|value=

awk -F'[|=]' '{if($4 == "value" && $5 == "") {print ("Error Found at Line: ",NR)} else {print $0}}' f
AS|REQ|XYZ|value=12
Error Found at Line:  2
它在
4th
列中搜索
value
,在
5th
列中搜索
blank

cat f
AS|REQ|XYZ|value=12
AS|REQ|XYZ|value=

awk -F'[|=]' '{if($4 == "value" && $5 == "") {print ("Error Found at Line: ",NR)} else {print $0}}' f
AS|REQ|XYZ|value=12
Error Found at Line:  2

它在
4th
列中搜索
value
,在
5th
列中搜索
blank

@JamesBrown对您提出的问题有正确的答案,但根据您发布的输入,您只需要:

awk -F'=' '{print ($NF=="" ? "Error" : $NF)}' file

如果这还不是你所需要的全部,那么编辑你的问题,以显示一些更具代表性的示例输入和预期输出。

@JamesBrown对你的问题有正确的答案,但考虑到你发布的输入,你只需要:

awk -F'=' '{print ($NF=="" ? "Error" : $NF)}' file

如果这还不是您所需要的全部,那么编辑您的问题,以显示一些更具代表性的示例输入和预期输出。

您可以更具体地说明抛出错误的含义。您可以更具体地说明抛出错误的含义。在编写If-else时,不要将条件设置为负值,让它成为积极的。这样你就不会冒产生双重否定的风险,例如,你不会盯着你的“else”块说“好吧,我来这里是因为4美元不等于价值,所以……这是什么意思?”。始终努力以积极的方式写入每个条件,在这种情况下,
if($4==“value=”)print“error”;else{other stuff}
。在编写if-else时,不要将条件设置为负值,而是将其设置为正值。这样你就不会冒产生双重否定的风险,例如,你不会盯着你的“else”块说“好吧,我来这里是因为4美元不等于价值,所以……这是什么意思?”。始终努力以积极的方式写入每个条件,在这种情况下,
if($4==“value=”)print“error”;else{other stuff}
。如此接近:)您可以将=和|放在[]内,如So-F'[=|]@grail-谢谢您的输入。如此接近:)您可以将=和|放在[]内,如So-F'[=|]@grail-谢谢您的输入。