作者:贝乐小凸 | 来源:互联网 | 2023-07-15 11:57
我有一个这样的 sample.txt 文件:
abc shk ansjc
def xyz dkksk
ghd ssk jshhd
djsh xyz dsoop
ssd swl jsjdl
我想打印 column1 & column2 但如果只有内容与“xyz”匹配,则可以打印 column2,因此输出如下。
abc
def xyz
ghd
djsh xyz
ssd
这是我到目前为止尝试过的,
awk '$2 == "xyz" { print $1,$2 }' output2.txt || awk '$2 != "xyz" { print $1 }'
谁能帮我得到这个输出?
回答
这是另一个 POSIX 投诉awk
解决方案:
awk '{print $1 ($2 == "xyz" ? OFS $2 : "")}' file
abc
def xyz
ghd
djsh xyz
ssd
Yes `awk '{print $1, ($2 == "xyz" ? $2 : "")}' file` works too but it leaves a trailing whitespace after 1st column.
Also goes using the `comma`: `{print $1, ($2=="xyz") ? $2 : ""}`
回答
使用您显示的示例,您可以尝试以下操作。
awk '{printf("%s%s",$1,($2=="xyz"? OFS $2:"")ORS)}' Input_file
或者
awk '{printf("%s%sn",$1,($2=="xyz"? OFS $2:""))}' Input_file
解释:简单的解释是,使用printf
函数awk
打印当前行中的值(根据 OP 的需要)。在它首先打印第一个字段,然后在打印第二个值时,检查条件如果第二个字段是xyz
打印空间,然后是$2 后跟新行,否则只打印新行。
回答
使用awk
允许操作NF
(例如:GNU awk
和mawk
)的实现:
$ awk '{NF = $2=="xyz" ? 2 : 1} 1' ip.txt
abc
def xyz
ghd
djsh xyz
ssd
您也可以使用,awk 'NF = $2=="xyz" ? 2 : 1'
因为表达式的计算结果为true。