我有一个这样的 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)
谁能帮我得到这个输出?
这是另一个 POSIX 投诉awk解决方案:
awk '{print $1 ($2 == "xyz" ? OFS $2 : "")}' file
abc
def xyz
ghd
djsh xyz
ssd
Run Code Online (Sandbox Code Playgroud)
使用您显示的示例,您可以尝试以下操作。
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 后跟新行,否则只打印新行。
使用awk允许操作NF(例如:GNU awk和mawk)的实现:
$ 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。