如何从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

因此,如果您从第七列而不是整个路径查看,我只想显示最后一个 之前的名称/。对于我的原始文件,我有 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

至于最终得到包含输出的相同输入文件名,只需谷歌一下,有一百万个答案都说相同的、琐碎的事情,不值得在这个或任何其他论坛上的每个答案中重复。

答案2

这个怎么样:

sed -Ei "s|/\S*/([^/]*)\.bam|\1|g" data.txt 
  • 查找以以下内容开头的字符串/
  • 任意数量的非空格符号
  • 其他/
  • 一群不/
  • 以。。结束.bam

如果找到这样的字符串 - 将其替换为第一组。

重复直到找不到这样的字符串。

相关内容