Форматировать файл в Unix / Linux? - PullRequest
4 голосов
/ 10 ноября 2010

У меня есть файл, содержащий страну, номер по каталогу, год, описание и цену

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?) и как узнать общую стоимость этого файла.

Ответы [ 4 ]

3 голосов
/ 10 ноября 2010

Я думал, что первые 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

3 голосов
/ 10 ноября 2010

С командной строкой 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, а написал бы подходящую программу для анализа.

1 голос
/ 11 ноября 2010

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

1 голос
/ 10 ноября 2010

Для соответствия , регулярное выражение -фу решение:

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...