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

moo*_*emu 3 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
Run Code Online (Sandbox Code Playgroud)

期望的输出:

john,jacob,jingle,schmidt,true
tiffany,amber,false,theissen,true
jack,john,sally,true,true
Run Code Online (Sandbox Code Playgroud)

我知道如何拉回一个有一个单词的行,并且没有这样的单词:

awk '/true/ && !/false/'
Run Code Online (Sandbox Code Playgroud)

但那不会工作,我知道如何删除一个单词,如果它在特定列中

awk 'BEGIN{FS=OFS=","} {sub(/true */, "", $5)} 1'
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将这两者结合起来.

我最好的猜测是:

awk 'BEGIN{FS=OFS=","} {"/true/",$5}
Run Code Online (Sandbox Code Playgroud)

最坏的情况....:)

awk 'BEGIN{FS=OFS=","} {sub(/true */, "Unmatchablestring", $5)} 1' | awk '/Unmatchablestring/'
Run Code Online (Sandbox Code Playgroud)

anu*_*ava 5

您可以使用:

awk -F, '$5 == "true"' file
Run Code Online (Sandbox Code Playgroud)

  • `~`是*match*运算符.它也会匹配像`footruebar`这样的东西,而`==`是等于运算符,它检查变量是否具有字面值'true`.你的问题表明你想要检查`$ 5`中是否存在术语`true`而不是'$ 5`中包含确切的单词`true`(仅此而已).但是,在再次检查您的演示数据后,我会说`==`就是您想要的. (2认同)