如果在 Linux 中仅匹配特定值,如何打印列?

Mad*_*ake 3 awk sed

我有一个这样的 sample.txt 文件:

abc shk ansjc
def xyz dkksk
ghd ssk jshhd
djsh xyz dsoop
ssd swl jsjdl 
Run Code Online (Sandbox Code Playgroud)

我想打印 column1 & column2 但如果只有内容与“xyz”匹配,则可以打印 column2,因此输出如下。

abc
def xyz
ghd 
djsh xyz
ssd
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止尝试过的,

awk '$2 == "xyz" { print $1,$2 }' output2.txt || awk '$2 != "xyz" { print $1 }'
Run Code Online (Sandbox Code Playgroud)

谁能帮我得到这个输出?

anu*_*ava 7

这是另一个 POSIX 投诉awk解决方案:

awk '{print $1 ($2 == "xyz" ? OFS $2 : "")}' file

abc
def xyz
ghd
djsh xyz
ssd
Run Code Online (Sandbox Code Playgroud)

  • 是的, `awk '{print $1, ($2 == "xyz" ? $2 : "")}' file` 也可以工作,但它会在第一列后留下一个尾随空格。 (3认同)
  • 还可以使用`逗号`:`{print $1, ($2=="xyz") ? $2 : ""}` (2认同)

Rav*_*h13 5

使用您显示的示例,您可以尝试以下操作。

awk '{printf("%s%s",$1,($2=="xyz"? OFS $2:"")ORS)}' Input_file
Run Code Online (Sandbox Code Playgroud)

或者

awk '{printf("%s%s\n",$1,($2=="xyz"? OFS $2:""))}' Input_file
Run Code Online (Sandbox Code Playgroud)

解释:简单的解释是,使用printf函数awk打印当前行中的值(根据 OP 的需要)。在它首先打印第一个字段,然后在打印第二个值时,检查条件如果第二个字段是xyz打印空间,然后是$2 后跟新行,否则只打印新行。


Sun*_*eep 5

使用awk允许操作NF(例如:GNU awkmawk)的实现:

$ awk '{NF = $2=="xyz" ? 2 : 1} 1' ip.txt
abc
def xyz
ghd
djsh xyz
ssd
Run Code Online (Sandbox Code Playgroud)

您也可以使用,awk 'NF = $2=="xyz" ? 2 : 1'因为表达式的计算结果为true