2010-11-10 2 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

+2

Являются ли поля табулированными? Что вы подразумеваете под «форматировать этот файл по порядку?» – cdhowie

+0

Привет, порядок сортировки не имеет значения. Я просто пытался напечатать их в хорошем формате (возможно, каждый из них был помещен на вкладке). И мой файл ограничивается только пробелом (как показано выше), и мне не удалось идентифицировать их в поле. – user503566

ответ

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

Ницца, мне тоже было интересно об этом. Но как вы будете печатать их на экране с каждой поданной, разделенной вкладкой. –

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 answer, awk конечно ваш друг здесь:

#!/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-файл с заголовками, которые вы можете импортировать в свою любимую таблицу. Он также добавляет общее количество. Переключайте запятые с вкладками по вкусу.

Смежные вопросы