0

我有一个制表符分隔的文件,看起来像这样。

"""chr1"    "38045559"  "38046059"  "C1orf122"""
""""    ""  ""  "C1orf122"""
""""    ""  ""  "YRDC"""
"""chr1"    "205291045" "205291545" "YOD1"""
"""chr1"    "1499717"   "1500625"   "SSU72"""

从此命令将 .csv 转换为制表符分隔文件后,我得到了此文件

perl -lpe 's/"/""/g; s/^|$/"/g; s/","/\t/g' <test.csv>test_tab

现在,我希望我的文件保持制表符分隔,但应从文件中删除所有额外的引号。但同时当我打印第 4 列时,我应该得到所有名称和第 1,2 列和第 3 列的坐标(我仍然得到它,但带有引号)。

我应该在上面的命令中做什么操作,请指导。

所需的输出是(因为我被要求清楚)

chr1    38045559    38046059    C1orf122
                                C1orf122
                                YRDC
chr1    205291045   205291545   YOD1
chr1    1499717     1500625     SSU72

这样当我提取第 4 列时,我应该得到

    C1orf122
    C1orf122
    YRDC 
    YOD1
    SSU72

谢谢

4

1 回答 1

2

您的命令似乎正在插入大多数引号以引入文件。而是正常打开文件:

use strict;
use warnings;

open CSV, 'test.csv' or die "can't open input file.";
open TAB, '>test.tab' or die "can't open output file.";

my @row_array;

while (<CSV>)
{
    #Remove any quotes that exist on the line (it is in default variable $_).
    s/"//g;

    #Split the current row into an array.
    my @fields = split /,/; 

    #write the output, tab-delimited file.
    print TAB join ("\t", @fields) . "\n";

    #Put the row into a multidimensional array.
    push @row_array, \@fields;
}

print "Column 4:\n";
print $_->[3] . "\n" foreach (@row_array);

print "\nColumns 1-3:\n";
print "@{$_}[0..2]\n" foreach (@row_array);

任何仍然存在的引号都将s/"//g;在上面的代码中删除。这将删除所有引号;它不检查它们是否在字段的开头和结尾。如果您可能在需要保留的数据中有一些引号,则需要更复杂的匹配模式。

更新:我添加了代码来创建一个制表符分隔的输出文件,因为你似乎想要那个。我不完全了解您对获取“所有名称......和坐标”的要求是什么。但是,您应该可以使用上面的代码。只需在“做事”的地方添加你需要的东西。例如,您可以使用$fields[0].

更新 2:添加代码以提取第 4 列,然后是第 1-3 列。使用多维数组的语法很棘手。有关详细信息,请参阅perldscperlref

更新 3:添加了代码以删除文件中仍然存在的引号。

于 2012-10-09T08:59:59.537 回答