每个条目重新格式化表多个分隔符

时间:2017-12-05 15:09:28

标签: python r bash

我正在使用Mac,并希望使用Bash,R或python 3进行重新格式化任务。

以下是我正在使用的表格的一个小示例。该表长达数千行,每行具有可变数量的列。此外,该示例包含在Isofrorm_之后开始的12个逗号分隔值,但为了便于阅读,我将其减少为4。

ENSMUSG0000001234 2.0 Isoform1_0.9,0.0,0.6,1.3 Isoform2_0.1,0.0,0.0,0.5
ENSMUSG0000005555 1.0 Isoform1_0.5,0.1,0.4,1.0 Isoform2_0.7,0.3,0.0,0.1 Isoform3_0.3,9.9,2.0,3.0

我希望能够搜索并重新格式化以下内容。要提取感兴趣的行,我可以使用

grep "ENSMUSG0000001234" ./filename

但我没有足够的经验知道如何通过位置和各种分隔符提取值并正确组织输出。我认为python可能是最好的工具,但我是一个python新手。

我需要重新格式化的条目看起来像下面的

0.9 0.0 0.6 1.3 
0.1 0.0 0.0 0.5

为清楚起见,它的rownames和列名是

IsoformID Cell1 Cell2 Cell3 Cell4
Isoform1 0.9 0.0 0.6 1.3 
Isoform2 0.1 0.0 0.0 0.5

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我看到您的优先解决方案是BashRPython 3,但这是我可以在php中为您提供问题的快速解决方案。< / p>

您可以将以下脚本保存到文件中,例如:reformat.php

<?php

$infile = $argv[1];

$handle = fopen($infile, "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $data = explode(' ', trim($line));
        print $data[0] . '-' . $data[1] . "\n";
        foreach (array_slice($data, 2) as $row) {
            print str_replace(['_', ','], ' ' , $row) . "\n";
        }
    }
    fclose($handle);
} else {
    exit("Unable to open file ($finfile)");
}

然后以下列方式从命令行运行它:

php reformat.php your_data_file

脚本逐行读取和处理您的文件。我使用前两个空格分隔字段作为块标识符。之后,我处理行中的其余字段(array_slice($data, 2))。

输出:

ENSMUSG0000001234-2.0
Isoform1 0.9 0.0 0.6 1.3
Isoform2 0.1 0.0 0.0 0.5
ENSMUSG0000005555-1.0
Isoform1 0.5 0.1 0.4 1.0
Isoform2 0.7 0.3 0.0 0.1
Isoform3 0.3 9.9 2.0 3.0

<强>更新

我试图找出如何使用python实现目标。我提出了以下解决方案。

#!/usr/bin/python

with open("input.txt") as f:
    for line in f:
        row = line.strip().split(' ')
        print row[0] + '-' + row[1]
        for data in row[2:]:
            print data.replace('_', ' ').replace(',', ' ')

这将产生如上所示的相同输出。