2つの列を持つテキストファイルがあります。最初の項目には、コードのリスト(GRT986Eなど)が含まれているか、他の場合は低ダッシュ(TRY546_TRE578など)で区切られた2つの部分からなるオブジェクトがあります。オブジェクト間に 1 つ以上の空行がある場合もあります。 2番目の列の一部のオブジェクトには関連変数があります。ファイルは次のようになります。
QR846OI bbbbbbbbb
PO3R56 ddddddd
UJ6Y68 eeeeeee
YU654R
PL92WS
GH654Y _ HUY765R tttttt
2番目の列を取得し、テキストを「is」にのみ置き換えたいのですが、最初の列と2番目の列を「、」で区切りたいと思います。出力.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