私のファイルには次の行が含まれています。
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}
\1
s/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