我有一个大文件内容如下所示:-
Quantity 20589
Quantity 12297
Quantity 100346
Quantity 0
Quantity 141999
Quantity 23662
Quantity 551071
Quantity 72917
Quantity 60460
Quantity 19712
Quantity 35530
Quantity 0
Quantity 29818
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Price 0
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
Discount 100
我想从这个文件创建一个新文件,其中的数据应为:-
Quantity,Price,Discount
20589,0,100
12297,0,100
100346,0,100
0,0,100
141999,0,100
23662,0,100
551071,0,100
72917,0,100
60460,0,100
19712,0,100
35530,0,100
0,0,100
29818,0,100
即读取原始文件,列名应该是新文件的标题和如上所示列出的相应值。
请帮我使用 shell 脚本编写一个新文件。
答案1
通过构建包含所有数据的大数组,一切都可以在单个命令内完成awk
,但如果文件很大,则可能会遇到可用内存问题。因此我会分几个步骤来完成此操作:
header=$(awk '{print $1}' file | uniq | tr '\n' ',')
printf "${header%?}\n" > output
paste -d, <(awk '$1=="Quantity"{print $2}' file) \
<(awk '$1=="Price"{print $2}' file) \
<(awk '$1=="Discount"{print $2}' file) >> output
这里唯一棘手的部分是删除标题末尾的最后一个逗号。我${par%?}
为此使用了构造。
答案2
有了 Perl 你可以有这样的方式,
#!/usr/bin/perl
use strict;
use warnings;
my $file=$ARGV[0];
open my $fId, '<', $file or die "Error opeining file <$file>.";
my @qty = ();
my @price = ();
my @discount = ();
while(<$fId>){
chomp;
my @fields = split (/\t/, $_);
push @qty , $fields[1] if $fields[0] =~ m/Quantity/;
push @price , $fields[1] if $fields[0] =~ m/Price/;
push @discount , $fields[1] if $fields[0] =~ m/Discount/;
}
close $fId;
print "Quantity,Price,Discount\n";
for(my $i = 0; $i < scalar @qty; $i++){
print "$qty[$i],$price[$i],$discount[$i]\n";
}
您需要传递文件名作为参数。
例如,./test.pl input_file