我有一个如下所示的文件:
Name Length EffectiveLength TPM NumReads
ENST00000456328.2|ENSG00000223972.5|OTTHUMG00000000961.2|OTTHUMT00000362751.1|DDX11L1-202|DDX11L1|1657|lncRNA| 1657 1493.961 0.112690 3.673
ENST00000450305.2|ENSG00000223972.5|OTTHUMG00000000961.2|OTTHUMT00000002844.2|DDX11L1-201|DDX11L1|632|transcribed_unprocessed_pseudogene| 632 468.996 0.000000 0.000
ENST00000488147.1|ENSG00000227232.5|OTTHUMG00000000958.1|OTTHUMT00000002839.1|WASH7P-201|WASH7P|1351|unprocessed_pseudogene| 1351 1187.961 9.176212 237.800
ENST00000619216.1|ENSG00000278267.1|-|-|MIR6859-1-201|MIR6859-1|68|miRNA| 68 69.000 0.000000 0.000
ENST00000473358.1|ENSG00000243485.5|OTTHUMG00000000959.2|OTTHUMT00000002840.1|MIR1302-2HG-202|MIR1302-2HG|712|lncRNA| 712 548.982 0.000000 0.000
ENST00000469289.1|ENSG00000243485.5|OTTHUMG00000000959.2|OTTHUMT00000002841.2|MIR1302-2HG-201|MIR1302-2HG|535|lncRNA| 535 372.012 0.000000 0.000
我希望输出为:
我尝试过,使用 AWK:
awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }'
它打印第一个 id ENST。但是当我将其更改为:
awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $5); print }'
它没有做任何事情。
所以我尝试了
awk -F\| '{print $5"\t"$7"\t"$9}'
它可以工作,但会生成两次长度列,并且输出文件会丢失标题。
有人可以帮忙吗?
答案1
假设您的<TAB>
-separated 文件的第一列始终有 9 个元素(实际上,“至少 5 个元素”就足够了),由竖线 ( |
) 分隔(您提供的示例中的第九个元素始终为空),并且您的目的是只从中选取第五个元素,您可以使用 AWK 的便捷split
功能:
awk -v FS='\t' -v OFS='\t' \
'NR > 1 { split($1, t, /\|/); $1 = t[5]; } 1' input_file |
column -t -R 2,3,4,5
column
来自实用程序Linux然后使用 package 将输出格式化为表 ( -t
),并将右对齐列的列表-R
作为逗号分隔列表提供给选项。
如果需要,您可以强制将适当的字段转换为数字,以更接近地匹配问题中显示的输出。例如,$5 = $5 + 0
你得到237.800
→237.8
和0.000
→ 0
。
或者,在上述假设下,扩展sub
您问题中所示的基于机构的方法,但要求确切地第一个字段中的九个(可能是空的、竖线分隔的元素)—AWK 脚本可能会变成(其他条件相同):
NR > 1 { gsub(/^([^|]*\|){4,4}|(\|[^|]*){4,4}$/,"",$1); } 1
gsub
使用 代替 是sub
因为我们要删除两个匹配的子字符串:前四个|
分隔的元素(注意^
锚点)和最后四个元素(注意$
锚点)。
答案2
世界是你的牡蛎..
如果awk
您拆分,|
那么您的所有数据都在最后一个字段中,并且您的Name
数据在其中$(NF-4)
,因此您可以......
awk -F'|' 'NR==1{print }NR>1{print $(NF-4) $NF}' file | column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.961 0.112690 3.673
DDX11L1-201 632 468.996 0.000000 0.000
WASH7P-201 1351 1187.961 9.176212 237.800
MIR6859-1-201 68 69.000 0.000000 0.000
MIR1302-2HG-202 712 548.982 0.000000 0.000
MIR1302-2HG-201 535 372.012 0.000000 0.000
然后您可以split
$NF
继续\t
获取0
格式
awk -F'|' '
NR==1{print }
NR>1{split($(NF),vs,"\\t"); print $(NF-4), vs[2]+0, vs[3]+0, vs[4]+0, vs[5]+0}' file |
column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.96 0.11269 3.673
DDX11L1-201 632 468.996 0 0
WASH7P-201 1351 1187.96 9.17621 237.8
MIR6859-1-201 68 69 0 0
MIR1302-2HG-202 712 548.982 0 0
MIR1302-2HG-201 535 372.012 0 0
或者如果你有 gawk
那么你也可以使用多个分隔符[|\t]
......
awk -F'[|\t]' '
NR==1{print }
NR>1{print $(NF-8), $(NF-3)+0, $(NF-2)+0, $(NF-1)+0, $NF+0}' file |
column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.96 0.11269 3.673
DDX11L1-201 632 468.996 0 0
WASH7P-201 1351 1187.96 9.17621 237.8
MIR6859-1-201 68 69 0 0
MIR1302-2HG-202 712 548.982 0 0
MIR1302-2HG-201 535 372.012 0 0
或者你可以awk
完全忽略它并且
cut -d '|' --output-delimiter=" " -f 5,9 file | column -t -R 2,3,4,5
Name Length EffectiveLength TPM NumReads
DDX11L1-202 1657 1493.961 0.112690 3.673
DDX11L1-201 632 468.996 0.000000 0.000
WASH7P-201 1351 1187.961 9.176212 237.800
MIR6859-1-201 68 69.000 0.000000 0.000
MIR1302-2HG-202 712 548.982 0.000000 0.000
MIR1302-2HG-201 535 372.012 0.000000 0.000