テキストをawkに置き換える

テキストをawkに置き換える

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

関連情報