2010-11-10 68 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文件,您可以將其導入到您最喜歡的電子表格中。它也增加了總數。根據口味切換帶有標籤的逗號。