4 votes

Formater un fichier sous Unix/Linux ?

J'ai un fichier contenant le pays, le numéro de catalogue, l'année, la description et le prix.

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

Le fichier n'est pas délimité par une "tabulation" ou un " :". Il n'y a que des espaces entre eux. Pouvez-vous me dire comment je peux formater ce fichier (en utilisant awk ?) et comment je peux trouver le prix total à partir de celui-ci.

3voto

jbremnant Points 394

Avec la ligne de commande perl :

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

et awk (en supposant que vous ayez des dollars à la fin de chaque ligne) :

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

Aussi, en réponse au commentaire. Si vous voulez reformater en ligne de commande :

$ 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

Si vous voulez faire cela correctement, je ne le ferais pas sur la ligne de commande, mais j'écrirais un programme approprié pour l'analyser.

3voto

udslk Points 481

Je pensais que les 3 premières et la dernière colonne étaient fixes, mais les colonnes du milieu ne le sont pas. Les colonnes du milieu sont donc conservées à la fin avec un espace entre elles et les colonnes fixes sont séparées par une tabulation afin que vous puissiez commencer à les éditer avec un programme de feuille de calcul :

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

1voto

altblue Points 639

Pour la conformité , a regexp -solution :

$ 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

1voto

Johnsyweb Points 45395

Élargir le champ d'action La réponse de udslk , awk est certainement votre ami ici :

#!/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
}

Il en ressort un fichier CSV avec des en-têtes, que vous pouvez importer dans votre tableur préféré. Il ajoute également le total. Remplacez les virgules par des tabulations selon votre goût.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X