Regex 仅当字符串存在于特定列中时才打印行

Regex 仅当字符串存在于特定列中时才打印行,regex,bash,awk,sed,Regex,Bash,Awk,Sed,仅当值/字符串存在于特定列中时,才需要有关awk(或sed)命令的帮助来选择行 例如: 我只想在第5列中存在“true”一词时返回该行,如果第5列中不存在“true”,则不返回该行 输入: john,jacob,jingle,schmidt,true jason,jack,john,true,false oscar,meir,true,weiner,false tiffany,amber,false,theissen,true jack,john,sally,true,true 期望输出: j

仅当值/字符串存在于特定列中时,才需要有关awk(或sed)命令的帮助来选择行

例如:

我只想在第5列中存在“true”一词时返回该行,如果第5列中不存在“true”,则不返回该行

输入:

john,jacob,jingle,schmidt,true
jason,jack,john,true,false
oscar,meir,true,weiner,false
tiffany,amber,false,theissen,true
jack,john,sally,true,true
期望输出:

john,jacob,jingle,schmidt,true
tiffany,amber,false,theissen,true
jack,john,sally,true,true
我知道怎么做 向后拉一行,该行有一个单词,但没有这样的单词:

awk '/true/ && !/false/'
awk -F, '$5 ~ /true/' file
但那是行不通的 我知道只有在某个特定的列中才能删除一个单词

awk 'BEGIN{FS=OFS=","} {sub(/true */, "", $5)} 1'
但我不知道如何将这两者结合起来

我最好的猜测是:

awk 'BEGIN{FS=OFS=","} {"/true/",$5}
最坏情况……)


如果您想检查第5列是否包含文本值
true
,或者是否应该是完全匹配的,那么您的问题就有点模糊了。如果要检查第5列是否包含
true
,请使用匹配运算符
~
,如下所示:

awk '/true/ && !/false/'
awk -F, '$5 ~ /true/' file
否则请遵循。

您可以使用:

awk -F, '$5 == "true"' file

我不知道要求是什么。。。如果第5列中存在单词“true”,则返回该行。。。可能由
~
运算符hmm实现,但OP的输入仅显示单词
true
,这就是为什么思想相等检查更准确。因此,~和==?
~
之间的差异就是匹配运算符。它还将匹配类似于
footruebar
的内容,而
=
是检查变量是否具有正确的文本值
true
的相等运算符。您的问题表明您想检查
true
一词是否存在于
$5
中,而不是
$5
包含确切的
true
(仅此而已)。然而,在再次检查您的演示数据之后,我想说,
=
是您想要的。@EdMorton非常感谢您的评论!我已经在想这个了。我做了一些测试,它像预期的那样“工作”,但现在我知道为什么了!我改变了,埃德·莫顿怎么说?同样在本例中,第5列中的值只能是True或False。但我还有其他地方可以使用类似的命令。非常感谢。如果我想在第5列中选择true或false,我会选择:awk-F,“$5~/true/&/false/”@moore1emu我的第一个版本使用了
“true”
,而不是
/true/
。虽然这也会起作用,并且在本地与当前版本相同,但它会产生不必要的开销,因为它需要将字符串
“true”
转换为模式
/true/
。当我说“开销”时,我指的是纳秒(!),所以对你们来说没什么好担心的,但对我来说很高兴知道。Ed提到了这一点,我很感谢您的评论。@moore1emu如果您想在第5列中允许true或false,您需要:
awk-F,“$5==”true“| |$5==”false