2016-04-01 6 views
0

Ich habe diese Datei:BASH SHELL Druckspalten mit bestimmten Reihenfolge

933|Mahinda|Perera|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
1129|Carmen|Lepland|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
4194|Hồ Chí|Do|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 
8333|Chen|Wang|female|1980-02-02|2010-03-15T10:21:43.365+0000|1.4.16.148|Internet Explorer 
8698|Chen|Liu|female|1982-05-29|2010-02-21T08:44:41.479+0000|14.103.81.196|Firefox 
8853|Albin|Monteno|male|1986-04-09|2010-03-19T21:52:36.860+0000|178.209.14.40|Internet Explorer 
10027|Ning|Chen|female|1982-12-08|2010-02-22T17:59:59.221+0000|1.2.9.86|Firefox 

und mit diesem Auftrag ./tool.sh --browsers -f <file>

Ich möchte die Anzahl der Browser in einer bestimmten Reihenfolge zählen, zum Beispiel:

Chrome 143 
Firefox 251 
Internet Explorer 67 

i verwenden Sie diesen Befehl:

if [ "$1" == "--browsers" -a "$2" == "-f" -a "$4" == "" ] 
then 
awk -F'|' '{print $8}' $3 | sort | uniq -c | awk ' {print $2 , $3 , $1} ' 
fi 

aber es funktioniert nur für 3 Argumente. Wie funktioniert es für viele Argumente? ein Browser mit 4 Worten zum Beispiel oder mehr

+0

Sie fragen, wie Sie Ihre Datei sortieren, oder wie Argumente zu verarbeiten? – ghoti

+0

beide .. wie kann ich die Anzahl der Anzahl von Browsern in der rechten mit einem Leerzeichen und mit Browsern mit mehr als 3 Worte – user3453854

+0

drucken Ich sehe nicht, wie Ihre Beispieldaten möglicherweise diese Ergebnisse erzeugen können; Ich sehe zum Beispiel keine 143 Zählungen von "Chrome". Was bedeuten Ihre Argumente? Was versuchen Sie eigentlich mit diesen Argumenten zu erreichen? – ghoti

Antwort

1

scheint wie eine awk einer -Liner ihren Browser zu zählen:

$ awk -F'|' '{a[$8]++} END{for(i in a){printf("%s %d\n",i,a[i])}}' inputfile 
Firefox 3 
Internet Explorer 4 

Dies erhöht Elemente eines Arrays, dann am Ende der Datei Schritte durch das Array und p zählt die Summen. Wenn Sie die Ausgabe sortiert haben möchten, können Sie sie einfach durch sort leiten. Ich sehe kein Problem mit mehreren Wörtern in einem Browsernamen.

-1

ich es in Perl tun würde:

#!/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my %count_of; 
while (<>) { 
    chomp; 
    $count_of{(split /\|/)[7]}++; 
} 

print Dumper \%count_of; 

Dies zu einem Einzeiler abgeholzt werden kann:

perl -F'\|' -lane '$c{$F[7]++}; END{ print "$_ => $c{$_}" for keys %c }' 
0

versuchen Sie dies:

awk -F"|" '{print $8}' in | sort | uniq -c | awk '{print $2,$1}' 

wo in die Eingabedatei ist.

Ausgang

[myShell] ➤ awk -F"|" '{print $8}' in | sort | uniq -c | awk '{print $2,$1}' 
Firefox 3 
Internet 4 

auch Argument für die Analyse ist besser getopts

heißt

#!/bin/bash 
function usage { 
    echo "usage: ..." 
} 

while getopts b:o:h opt; do 
    case $opt in 
    b) 
     fileName=$OPTARG 
     echo "filename[$fileName]" 
     awk -F"|" '{print $8}' $fileName | sort | uniq -c | awk '{print $2,$1}' 
     ;; 
    o) 
     otherargs=$OPTARG 
     echo "otherargs[$otherargs]" 
     ;; 
    h) 
     usage && exit 0 
     ;; 
    ?) 
     usage && exit 2 
     ;; 
    esac 
done 

Ausgang

[myShell] ➤ ./arg -b in 
filename[in] 
Firefox 3 
Internet 4 
0

Ihre letzte Awk hart Code zu verwenden s zwei Felder; Fahren Sie einfach mit $4, $5, $6 usw. fort, um weitere Felder zu drucken. Dadurch wird jedoch ein Leerzeichen für jedes Komma hinzugefügt.

Noch besser wäre es, da das erste Feld mit fester Breite ist (denn das ist das Ausgabeformat von uniq -c ist), können Sie tun print substr($0,8), $1