文件分隔符不适用于 awk 代码

文件分隔符不适用于 awk 代码

我有一个如下所示的文件:

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.800237.80.0000

或者,在上述假设下,扩展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

相关内容