我有一个文件,其中的条目由 | 分隔。和选项卡。
#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