我有一个制表符分隔的文本文件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
如果找到这样的字符串 - 将其替换为第一组。
重复直到找不到这样的字符串。