用 awk 替换文本

用 awk 替换文本

我有一个包含 2 列的文本文件。第一个包含代码列表(例如 GRT986E),或者在其他一些情况下,我有一个由两部分组成的对象,由低破折号分隔(例如 TRY546 _ TRE578)。有时,对象之间有一个或多个空行。对于第二列中的某些对象,有一个关联的变量。文件是这样的:

QR846OI bbbbbbbbb

PO3R56  ddddddd
UJ6Y68 eeeeeee


YU654R

PL92WS
GH654Y _ HUY765R tttttt

我想获取第二列并仅用“是”替换文本,并且我想用“,”分隔第一列和第二列。输出.txt 将如下所示:

QR846OI,yes

PO3R56,yes
UJ6Y68,yes


YU654R

PL92WS
GH654Y _ HUY765R,yes

我使用这个命令行:

awk -F , '{ if ($2 != " ") $2="yes";}1' OFS=, good_interactors.txt > output.txt

但效果不太好。

答案1

我将使用删除下划线周围的空格sed,然后可以选择将其恢复。这使得更容易awk

awk '{OFS=","}NF==2{$2="yes"}1' <(sed 's/ _ /_/g' file) \
| sed 's/_/ _ /g' # <- this part is optional

输出:

QR846OI,yes

PO3R56,yes
UJ6Y68,yes


YU654R

PL92WS
GH654Y _ HUY765R,yes

答案2

尝试

 awk 'NF>1 {$NF="yes" ; print ; } NF <= 1 { print }' file | sed 's/ yes/,yes/'
  • 此过滤器针对NF(字段数)。

  • sed删除空格的命令

  • 有些人用1而不是print

    awk 'NF>1 {$NF="yes" ; }1' file | sed 's/ yes/,yes/'
    

答案3

正确的 awk :

awk -v repl=",yes" '
  BEGIN {
    s = "[[:space:]]"; S = "[^[:space:]]"
    pat = sprintf("%s+%s+%s*$", s, S, s)
  }
  NF>1 && sub(pat, repl) || 1' file

相关内容