我有一个带有65列和350行的制表符分隔的Excel文件。我需要重新排列它,使列60-65插入column1之后,然后是col2,col3 ... col 59只使用PERL ..即
Col1 Col60 Col61 Col62 Col2 Col3 Col4 Col5 Col6
我写了一个shell命令来执行它:
paste<(awk -F'\ t''{print $ 1}'part.xls)<(awk -F'\ t''{print $ 60}'part.xls)<(awk -F '\ t''{print $ 61}'part.xls)<(awk -F'\ t''{print $ 62}'part.xls)<(awk -F'\ t'-vf = 2 -vt = 59'{for(i = f; i< = t; i ++)printf(“%s \ t%s”,$ i,(i == t)?“\ n”:OFS)}'part.xls )> new.xls
part.xls =包含65列的原始文件 new.xls =包含重新排序列的文件
我需要将它合并到我的PERL脚本中。我尝试使用系统命令,但它给了我错误。
system(“paste<(awk -F'\ t''{print \ $ 1}'part.xls)<(awk -F'\ t''{print \ $ 60}'part.xls)&lt ;(awk -F'\ t''{print \ $ 61}'part.xls)<(awk -F'\ t''{print \ $ 62}'part.xls)<(awk -F'\ tt '-vf = 2 -vt = 59'{for(i = f; i< = t; i ++)printf(“%s \ t%s”,$ i,(i == t)?“\ n”: OFS)}'part.xls)> new.xls“);
有人可以指出我的错误吗?提前谢谢。
答案 0 :(得分:0)
您的awk
代码可以简化:
awk -F"\t" '
{
printf("%s\t%s\t%s\t%s", $1, $60, $61, $62)
for (i=2; i<=59; ++i) printf("\t%s", $i)
print ""
}
' part.xls > new.xls
但是既然你已经在使用perl
(这是一种超级awk&#34;!),你也可以这样做:
open(my $fin, "<", "part.xls") or die("Can't open part.xls: $!");
open(my $fout, ">", "new.xls") or die("Can't open new.xls: $!");
while (<$fin>) {
my @f = split(/\t/);
my $lineout = join("\t", $f[0], @f[59..61], @f[1..58]);
print $fout $lineout, "\n";
}
close($fin);
close($fout);
请注意,perl
中的字段索引从零开始,而awk
中的字段索引基于一个,因此在perl
中,它们都少了一个。