从文件中删除双引号

时间:2012-10-09 08:27:07

标签: perl

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

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

我从此命令<。p>转换.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

谢谢

1 个答案:

答案 0 :(得分: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]引用第1列。

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

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