我有一个包含 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