与えられた文字列が出るまで3番目の列を切り捨てます。

与えられた文字列が出るまで3番目の列を切り捨てます。

入力する:

W41784094   CH60104475  lasbalsrbla bla foo bar bla PT~CH60104475
W41788464   WO60444453  hellobla bla -bla foo bar 432 alaf. PT~CH60107925
W41753387   IN61026681  sim##bla-bla bla foo bar blab lba la:bla32 bla

出力:

W41784094   CH60104455  CH60104455
W41788464   WO60444453  CH60107925
W41753387   IN61026681  NA

質問:「PT~」まで3列目を切り取るには?

ただし、「PT〜」が常に存在しない場合は、「NA」が必要です。 \

タブは区切り記号です。

ベストアンサー1

awk代わりに;を使用してこれを行う方が簡単ですsedawkオプションの場合:

< input awk 'BEGIN {FS=OFS="\t"} {if ($3~/PT~/) sub(/.*PT~/, "", $3); else $3="NA"; print}'

拡張:

BEGIN {
    FS=OFS="\t"
}
{
    if ($3 ~ /PT~/)
        sub(/.*PT~/, "", $3);
    else
        $3 = "NA";
    print
}
  • BEGIN {FS=OFS="\t"}:各区切り文字列がレコードのフィールドと見なされ(1)、各レコードの後に​​区切り文字が印刷されるように(2)、フィールド区切り記号1と出力フィールド区切り文字2を設定します。TABTAB
  • {if ($3~/PT~/) sub(/.*PT~/, "", $3); else $3="NA"; print}:レコードの3番目のフィールド()が正規表現$3()と一致する場合(つまり、正規表現を含む場合)、正規表現()の最初の左端から最も広い一致()を置き換えます。部分文字列)レコード()の3番目のフィールド()に空の文字列()を追加し、そうでない場合は3番目のフィールド()を文字列()に設定してレコードを印刷します。~PT~/PT~/sub()/.*PT~//.*PT~/PT~""$3$3NA"NA"

おすすめ記事