sed または awk を使用して、文字列の先頭と末尾が既知の特定の列から文字列を削除します。

sed または awk を使用して、文字列の先頭と末尾が既知の特定の列から文字列を削除します。

私のファイルには次の行が含まれています。

1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

POSで始まり、; GINFO =で終わる4列のすべての項目を削除したいと思います。

私の考えでは、これがうまくいくようです:sed -e 's/POS=.*;GINFO=//‘ file > new_file

可能であれば、4列を具体的に指す方法は何ですか?

答え1

4 番目の列を直接指定するには、次のコマンドを使用します。awk方法:

awk '{ sub(/^POS.*GINFO=/, "", $4) }1' file > new_file
  • $4- 4番目のフィールドを指します。
  • sub(/^POS.*GINFO=/, "", $4)/^POS.*GINFO=- 4番目のフィールドのパターンで指定された部分文字列を置き換えます。

答え2

参照する列と既知の列がスペースで区切られている場合は、次のことができます。

sed -E 's/^(([^ ]* ){3})POS=.*;GINFO=/\1/' infile

この一致は、最初のスペースが表示されるまで^(([^ ]* ){3})行を要求することから始まり、それを最大回数だけ繰り返します。角かっこはこの一致を逆参照とグループ化された一致にし、後で代替部分に復元します。^*[^ ]{3}\1s/pattern/replace/

これは(...)POS=.*;GINFO=また表示されるまでに続くPOS=すべての項目と一致し、出力から削除されます。.*;GINFO

以下に提供されるサンプルデータの場合:

1 10241 POS=rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

結果を返します。

1 10241 POS=rs960927773 DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 DDX11L1:100287102;R5;ASP

POSIXlyのバージョンは次のとおりです。

sed 's/^\([^ ]* \)\([^ ]* \)\([^ ]* \)POS=.*;GINFO=/\1\2\3/' infile

答え3

POSIXly sedでは、次のことができます。

sed -ne '
   #place a markholder at the beginning of the 4th field
   s/[^[:blank:]][[:blank:]]\{1,\}/&\
/3

   # perform the sub on the 4th field
   s/\nPOS=.*;GINFO=//p
'  input_file

関連情報