分隔未与管道分隔文件对齐的字段

分隔未与管道分隔文件对齐的字段

我有一个文件,其中的条目由 | 分隔。和选项卡。

#Name   Length  Bases   Coverage    Reads   RPKM    Frags   FPKM
ENST00000423372.3|ENSG00000237683.5|-|-|AL627309.1-201|AL627309.1|2661|UTR5:1-70|CDS:71-850|UTR3:851-2661|  2661    1989878 747.7933    13178   33.6603 6589    33.6603
ENST00000426406.1|ENSG00000235249.1|OTTHUMG00000002860.1|OTTHUMT00000007999.1|OR4F29-001|OR4F29|995|UTR5:1-19|CDS:20-958|UTR3:959-995|  995 302 0.3035  2   0.0137  1   0.0137
ENST00000599533.1|ENSG00000269831.1|-|-|AL669831.1-201|AL669831.1|129|CDS:1-129|    129 52548   407.3488    348 18.3359 174 18.3359
ENST00000437963.1|ENSG00000187634.6|OTTHUMG00000040719.8|OTTHUMT00000097862.3|SAMD11-003|SAMD11|387|UTR5:1-60|CDS:61-387|   387 302 0.7804  2   0.0351  1   0.0351
ENST00000342066.3|ENSG00000187634.6|OTTHUMG00000040719.8|OTTHUMT00000276866.2|SAMD11-010|SAMD11|2551|UTR5:1-83|CDS:84-2129|UTR3:2130-2551|  2551    17818   6.9847  118 0.3144  59  0.3144
ENST00000341065.4|ENSG00000187634.6|OTTHUMG00000040719.8|OTTHUMT00000097860.4|SAMD11-001|SAMD11|2191|CDS:1-1769|UTR3:1770-2191| 2191    12080   5.5135  80  0.2482  40  0.2482
ENST00000455979.1|ENSG00000187634.6|OTTHUMG00000040719.8|OTTHUMT00000097863.4|SAMD11-004|SAMD11|1731|CDS:1-1625|UTR3:1626-1731| 1731    302 0.1745  2   0.0079  1   0.0079
ENST00000598827.1|ENSG00000268179.1|-|-|AL645608.1-201|AL645608.1|336|CDS:1-336|    336 302 0.8988  2   0.0405  1   0.0405

我想要的输出为

AL627309.1  33.6603
OR4F29      0.0137
AL669831.1  18.3359
SAMD11  0.0351
SAMD11  0.3144
SAMD11  0.2482
SAMD11  0.0079
     
separated by tab. 

我更换了所有|通过选项卡使用tr '|' "\t" < input.file ,但结果文件显示了这一点,因为字段是可变的。

#Name                                       Length  Bases   Coverage    Reads   RPKM    Frags   FPKM    
ENST00000423372.3   ENSG00000237683.5   -   -   AL627309.1-201  AL627309.1  2661    UTR5:1-70   CDS:71-850  UTR3:851-2661       2661    1989878 747.7933    13178   33.6603 6589    33.6603
ENST00000426406.1   ENSG00000235249.1   OTTHUMG00000002860.1    OTTHUMT00000007999.1    OR4F29-001  OR4F29  995 UTR5:1-19   CDS:20-958  UTR3:959-995        995 302 0.3035  2   0.0137  1   0.0137
ENST00000599533.1   ENSG00000269831.1   -   -   AL669831.1-201  AL669831.1  129 CDS:1-129       129 52548   407.3488    348 18.3359 174 18.3359     
ENST00000437963.1   ENSG00000187634.6   OTTHUMG00000040719.8    OTTHUMT00000097862.3    SAMD11-003  SAMD11  387 UTR5:1-60   CDS:61-387      387 302 0.7804  2   0.0351  1   0.0351  
ENST00000342066.3   ENSG00000187634.6   OTTHUMG00000040719.8    OTTHUMT00000276866.2    SAMD11-010  SAMD11  2551    UTR5:1-83   CDS:84-2129 UTR3:2130-2551      2551    17818   6.9847  118 0.3144  59  0.3144
ENST00000341065.4   ENSG00000187634.6   OTTHUMG00000040719.8    OTTHUMT00000097860.4    SAMD11-001  SAMD11  2191    CDS:1-1769  UTR3:1770-2191      2191    12080   5.5135  80  0.2482  40  0.2482  
ENST00000455979.1   ENSG00000187634.6   OTTHUMG00000040719.8    OTTHUMT00000097863.4    SAMD11-004  SAMD11  1731    CDS:1-1625  UTR3:1626-1731      1731    302 0.1745  2   0.0079  1   0.0079  

如果有一种优雅的方法可以做到这一点,请指导我。

答案1

假设我的制表符与空格正确,这应该可行。column -t如果您要将其通过管道传输到任何其他工具中,请删除 ,以便您在字段之间只有一个选项卡

awk -F'[|\t]' '!/^#/{printf "%s\t%s\n", $6, $NF}' your_datafile | column -t

|这会在任一选项卡上分割数据,从 1. 开始对列进行编号!/^#/,匹配任何不以 开头的行#(目的是跳过任何标题行,因此我们可以使用NR>1)。该$6构造体选择第六个字段;$NF选择最后一个字段,无论其字段编号如何。

使用示例数据文件输出,

AL627309.1  33.6603
OR4F29      0.0137
AL669831.1  18.3359
SAMD11      0.0351
SAMD11      0.3144
SAMD11      0.2482
SAMD11      0.0079
AL645608.1  0.0405

答案2

使用磨坊主、grep 并粘贴

paste <(<input.txt tail -n +2 | grep -oP '[0-9]+\.[0-9]+$') \
<(<input.txt tail -n +2 | mlr --nidx --ifs "|" unsparsify then clean-whitespace then cut -f 6)

你将会拥有

AL627309.1      33.6603
OR4F29  0.0137
AL669831.1      18.3359
SAMD11  0.0351
SAMD11  0.3144
SAMD11  0.2482
SAMD11  0.0079
AL645608.1      0.0405

你的输入很奇怪。您应该在请求中指定您想要的最后一个字段是每行的最后一个数值而不是特定字段

+-------------------+-------------------+----------------------+----------------------+----------------+------------+------+------------+--------------------------------------------+---------------------------------------+--------------------------------------------------+
| 1                 | 2                 | 3                    | 4                    | 5              | 6          | 7    | 8          | 9                                          | 10                                    | 11                                               |
+-------------------+-------------------+----------------------+----------------------+----------------+------------+------+------------+--------------------------------------------+---------------------------------------+--------------------------------------------------+
| ENST00000423372.3 | ENSG00000237683.5 | -                    | -                    | AL627309.1-201 | AL627309.1 | 2661 | UTR5:1-70  | CDS:71-850                                 | UTR3:851-2661                         | 2661 1989878 747.7933 13178 33.6603 6589 33.6603 |
| ENST00000426406.1 | ENSG00000235249.1 | OTTHUMG00000002860.1 | OTTHUMT00000007999.1 | OR4F29-001     | OR4F29     | 995  | UTR5:1-19  | CDS:20-958                                 | UTR3:959-995                          | 995 302 0.3035 2 0.0137 1 0.0137                 |
| ENST00000599533.1 | ENSG00000269831.1 | -                    | -                    | AL669831.1-201 | AL669831.1 | 129  | CDS:1-129  | 129 52548 407.3488 348 18.3359 174 18.3359 |                                       |                                                  |
| ENST00000437963.1 | ENSG00000187634.6 | OTTHUMG00000040719.8 | OTTHUMT00000097862.3 | SAMD11-003     | SAMD11     | 387  | UTR5:1-60  | CDS:61-387                                 | 387 302 0.7804 2 0.0351 1 0.0351      |                                                  |
| ENST00000342066.3 | ENSG00000187634.6 | OTTHUMG00000040719.8 | OTTHUMT00000276866.2 | SAMD11-010     | SAMD11     | 2551 | UTR5:1-83  | CDS:84-2129                                | UTR3:2130-2551                        | 2551 17818 6.9847 118 0.3144 59 0.3144           |
| ENST00000341065.4 | ENSG00000187634.6 | OTTHUMG00000040719.8 | OTTHUMT00000097860.4 | SAMD11-001     | SAMD11     | 2191 | CDS:1-1769 | UTR3:1770-2191                             | 2191 12080 5.5135 80 0.2482 40 0.2482 |                                                  |
| ENST00000455979.1 | ENSG00000187634.6 | OTTHUMG00000040719.8 | OTTHUMT00000097863.4 | SAMD11-004     | SAMD11     | 1731 | CDS:1-1625 | UTR3:1626-1731                             | 1731 302 0.1745 2 0.0079 1 0.0079     |                                                  |
| ENST00000598827.1 | ENSG00000268179.1 | -                    | -                    | AL645608.1-201 | AL645608.1 | 336  | CDS:1-336  | 336 302 0.8988 2 0.0405 1 0.0405           |                                       |                                                  |
+-------------------+-------------------+----------------------+----------------------+----------------+------------+------+------------+--------------------------------------------+---------------------------------------+--------------------------------------------------+

答案3

我们可以使用 轻松找出第 6 个管道分隔字段cut,但第 8 个字段 ( FPKM) 似乎包含多个管道分隔数据,导致整个表变得不对齐。

因此,为了简单起见,我们使用cut第 6 个字段 on ,然后使用sed删除从第一个|选项卡到最后一个选项卡的每行上的所有内容。

$ cut -d '|' -f 6- file | sed -n '1!s/|.*\([[:blank:]]\)/\1/p'
AL627309.1      33.6603
OR4F29  0.0137
AL669831.1      18.3359
SAMD11  0.0351
SAMD11  0.3144
SAMD11  0.2482
SAMD11  0.0079
AL645608.1      0.0405

我上面使用的方式sed使其完全跳过标题行,然后允许在该行的最后一段数据前面使用空格或制表符。我重复使用空格或制表符作为最后一个字段和原始第六个字段之间的分隔符。

在使用 的支持进程替换的 shell 中<(...),您可以使用以下命令将原始数据重新格式化为制表符分隔集,其中有问题的列保留其管道分隔符。column -t为了演示目的,我在最后运行了它,但是如果您需要制表符分隔的输出,则应该将其删除。

paste <( cut -d '|' -f -7 file | tr '|' '\t' ) \
      <( cut -d '|' -f 8- file | sed 's/|[[:blank:]]//' ) |
tail -n +2 | column -t

相关内容