2010-11-10 72 views
4

我有一个包含文件的国家,目录号,年份,描述和价格在Unix/Linux中格式化文件?

Kenya 563-45 1995 Heron Plover Thrush Gonolek Apalis $6.60 
Surinam 632-96 1982 Butterfliers $7.50 
Seychelles 831-34 2002 WWF Frogs set of 4 $1.40 
Togo 1722-25 2010 Cheetah, Zebra, Antelope $5.70 

文件不是由一个“标签”或带分隔符“:”任何东西。他们之间只有空间。你能告诉我如何格式化这个文件(使用awk?)以及如何从中找到总价格。

+1

是否要按国家对文件进行排序? – birryree 2010-11-10 17:57:41

+2

字段是否由制表符分隔? “按顺序格式化此文件”是什么意思? – cdhowie 2010-11-10 17:57:49

+0

嗨,排序顺序并不重要。我只是试图以一种很好的格式打印它们(也许每个页面都由一个制表符分隔)。而且我的文件只能用空格分隔(如上所示),并且我没有办法根据字段识别它们。 – user503566 2010-11-10 18:06:55

回答

3

使用命令行的Perl:

$ cat /your/file | perl -e '$sum=0; for(<STDIN>) { $sum += $1 if(/\$([\d\.]+)/); }; print "$sum\n"' 
21.2 

和awk(假设你有美元,在每一行的末尾):

$ cat /your/file | awk '{s+=substr($NF,2)} END{ print s}' 
21.2 

此外,在应对评论。如果你想重新格式化命令行:

$ cat /your/file | perl -e 'for(<STDIN>){@a=split /\s+/; $p=pop @a; \ 
    $line=join "|", ($a[0],$a[1],$a[2], (join" ",@a[3..$#a]) ,$p); print "$line\n"}' 

Kenya|563-45|1995|Heron Plover Thrush Gonolek Apalis|$6.60 
Surinam|632-96|1982|Butterfliers|$7.50 
Seychelles|831-34|2002|WWF Frogs set of 4|$1.40 
Togo|1722-25|2010|Cheetah, Zebra, Antelope|$5.70 

如果要正确做到这一点,我愿意做这不是在CMD线,但写一个适当的程序来解析它。

+0

不错,我也在想这个。但是,如何将它们打印到屏幕上,每个区域由一个制表符分隔。 – 2010-11-10 18:22:16

3

我认为前3列和后列是固定含义,但中间列不固定。因此,中间柱保持在去年与之间的空间和固定列由制表分隔,这样你就可以开始与一些电子表格程序来编辑:

awk '{ printf("%s\t%s\t%s\t%s\t", $1, $2, $3, $NF); for(i=4; i<NF; i++){ printf("%s ", $i); } printf("\n") }' < yourlist.txt

1

对于符合,一个regexp-FU的解决方案:

$ perl -lne '/^ (.+?) \s+ (\d+-\d+) \s+ (\d{4}) \s+ (.+?) \s+ (\$ (\d+ (?:\.\d+)?)) \s* $/x and $t+=$6, print join "•",$1,$2,$3,$4,$5 }{ print $t' input_file 
Kenya•563-45•1995•Heron Plover Thrush Gonolek Apalis•$6.60 
Surinam•632-96•1982•Butterfliers•$7.50 
Seychelles•831-34•2002•WWF Frogs set of 4•$1.40 
Togo•1722-25•2010•Cheetah, Zebra, Antelope•$5.70 
21.2 
1

扩大在udslk's answerawk肯定是你的朋友在这里:

#!/usr/bin/env awk -f 
BEGIN { 
    print "country, \"catalog number\", year, description, \"price ($)\"" 
} 

{ 
    description = $4 
    for (f = 5; f < NF; ++f) { 
     description = description " " $f 
    } 
    price = substr($NF, 2) 
    total += price 

    printf "\"%s\", \"%s\", \"%s\", \"%s\", %0.2f\n", $1, $2, $3, description, price 
} 

END { 
    printf "Total, , , , %0.2f\n", total 
} 

这会将包含标题的CSV文件转换为CSV文件,您可以将其导入到您最喜欢的电子表格中。它也增加了总数。根据口味切换带有标签的逗号。