Linuxのテキストファイルから列名のパスを削除する方法は?

Linuxのテキストファイルから列名のパスを削除する方法は?

data.txt次のタブで区切られたテキストファイルがあります。

# Program used for this                             
Geneid  Chr Start   End Strand  Length  /users/doc3/data/Q0062/input/HPR4/HPR4.bam  /users/doc3/data/Q0062/input/HPR5_ctrl/HPR5_ctrl.bam    /users/doc3/data/Q0062/input/HPR6/HPR6.bam
ENSG00000224571.1   GL000008.2  5072    5352    -   281 0   0   0
ENSG00000226369.1   GL000008.2  20450   20767   +   318 0   0   0
ENSG00000280961.1   GL000008.2  24985   25272   +   288 0   0   0
ENSG00000227871.1   GL000008.2  43499   43703   +   205 0   0   0
ENSG00000251917.1   GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2    83529;83927;84030;85457;85567;85567;85593;88636;88636;173516;173838 83545;84145;84145;85477;85625;85625;85625;88789;88789;173643;173931 +;+;+;+;+;+;+;+;+;+;+   692 0   3   2
ENSG00000231423.1   GL000008.2  115523  115813  +   291 0   0   5
ENSG00000228465.1   GL000008.2  119026  119424  +   399 11  4   7
ENSG00000232585.1   GL000008.2  120703  120999  +   297 5   0   0
ENSG00000234081.1   GL000008.2;GL000008.2   124725;153003   124857;153715   +;+ 846 2   1   0
ENSG00000172352.5   GL000008.2  130736  131045  +   310 4   2   1

必要な出力は次のようになります。

# Program used for this                             
Geneid  Chr Start   End Strand  Length  HPR4    HPR5_ctrl   HPR6
ENSG00000224571.1   GL000008.2  5072    5352    -   281 0   0   0
ENSG00000226369.1   GL000008.2  20450   20767   +   318 0   0   0
ENSG00000280961.1   GL000008.2  24985   25272   +   288 0   0   0
ENSG00000227871.1   GL000008.2  43499   43703   +   205 0   0   0
ENSG00000251917.1   GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2    83529;83927;84030;85457;85567;85567;85593;88636;88636;173516;173838 83545;84145;84145;85477;85625;85625;85625;88789;88789;173643;173931 +;+;+;+;+;+;+;+;+;+;+   692 0   3   2
ENSG00000231423.1   GL000008.2  115523  115813  +   291 0   0   5
ENSG00000228465.1   GL000008.2  119026  119424  +   399 11  4   7
ENSG00000232585.1   GL000008.2  120703  120999  +   297 5   0   0
ENSG00000234081.1   GL000008.2;GL000008.2   124725;153003   124857;153715   +;+ 846 2   1   0
ENSG00000172352.5   GL000008.2  130736  131045  +   310 4   2   1

したがって、フルパスではなく7番目の列を見ると、最後の列の前に名前だけを表示したいと思います/。元のファイルには異なる名前の100列があります。

新しいファイルを作成したくないが、data.txt同じファイルを変更したい。どうすればいいですか?

答え1

awkを使用して例に示されているテキストを操作する方法は次のとおりです。

$ awk 'BEGIN{FS=OFS="\t"} NR==2{ for (i=1; i<=NF; i++) { sub("/[^/]*$","",$i); sub(".*/","",$i) } } 1' file
# Program used for this
Geneid  Chr     Start   End     Strand          HPR4    HPR5_ctrl       HPR6
ENSG00000224571.1       GL000008.2      5072    5352    -       281     0       0       0
ENSG00000226369.1       GL000008.2      20450   20767   +       318     0       0       0
ENSG00000280961.1       GL000008.2      24985   25272   +       288     0       0       0
ENSG00000227871.1       GL000008.2      43499   43703   +       205     0       0       0
ENSG00000251917.1       GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2        83529;83927;84030;85457;85567;85567;85593;88636;88636;173516;173838     83545;84145;84145;85477;85625;85625;85625;88789;88789;173643;173931     +;+;+;+;+;+;+;+;+;+;+   692     0       3       2
ENSG00000231423.1       GL000008.2      115523  115813  +       291     0       0       5
ENSG00000228465.1       GL000008.2      119026  119424  +       399     11      4       7
ENSG00000232585.1       GL000008.2      120703  120999  +       297     5       0       0
ENSG00000234081.1       GL000008.2;GL000008.2   124725;153003   124857;153715   +;+     846     2       1       0
ENSG00000172352.5       GL000008.2      130736  131045  +       310     4       2       1

または必要に応じて:

$ awk 'BEGIN{FS=OFS="\t"} NR==2{ for (i=1; i<=NF; i++) if ( (n=split($i,a,"/")) > 1 ) $i=a[n-1] } 1' file
# Program used for this
Geneid  Chr     Start   End     Strand          HPR4    HPR5_ctrl       HPR6
ENSG00000224571.1       GL000008.2      5072    5352    -       281     0       0       0
ENSG00000226369.1       GL000008.2      20450   20767   +       318     0       0       0
ENSG00000280961.1       GL000008.2      24985   25272   +       288     0       0       0
ENSG00000227871.1       GL000008.2      43499   43703   +       205     0       0       0
ENSG00000251917.1       GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2;GL000008.2        83529;83927;84030;85457;85567;85567;85593;88636;88636;173516;173838     83545;84145;84145;85477;85625;85625;85625;88789;88789;173643;173931     +;+;+;+;+;+;+;+;+;+;+   692     0       3       2
ENSG00000231423.1       GL000008.2      115523  115813  +       291     0       0       5
ENSG00000228465.1       GL000008.2      119026  119424  +       399     11      4       7
ENSG00000232585.1       GL000008.2      120703  120999  +       297     5       0       0
ENSG00000234081.1       GL000008.2;GL000008.2   124725;153003   124857;153715   +;+     846     2       1       0
ENSG00000172352.5       GL000008.2      130736  131045  +       310     4       2       1

出力を含む同じ入力ファイル名で終わる場合、Googleで検索すると、同じで些細なことを言う100万の回答があり、このフォーラムまたは他のフォーラムのすべての回答で繰り返す価値はありません。

答え2

これはどうですか:

sed -Ei "s|/\S*/([^/]*)\.bam|\1|g" data.txt 
  • 次に始まる文字列を探す/
  • 空白以外の文字数
  • その他/
  • そうでない人の集団/
  • によって。 。終わる.bam

そのような文字列が見つかったら、最初のグループに置き換えます。

その文字列が見つからないまで繰り返します。

関連情報