我有一个制表符分隔文件,看起来像这样。
"""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
谢谢
答案 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列。使用多维数组的语法很棘手。有关详细信息,请参阅perldsc和perlref。
更新3 :添加了代码以删除文件中仍然存在的引号。