入力する:
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
代わりに;を使用してこれを行う方が簡単ですsed
。awk
オプションの場合:
< 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を設定します。TAB
TAB
{if ($3~/PT~/) sub(/.*PT~/, "", $3); else $3="NA"; print}
:レコードの3番目のフィールド()が正規表現$3
()と一致する場合(つまり、正規表現を含む場合)、正規表現()の最初の左端から最も広い一致()を置き換えます。部分文字列)レコード()の3番目のフィールド()に空の文字列()を追加し、そうでない場合は3番目のフィールド()を文字列()に設定してレコードを印刷します。~
PT~
/PT~/
sub()
/.*PT~/
/.*PT~/
PT~
""
$3
$3
NA
"NA"