2017-06-28 4 views
-2

Ich habe eine Datei, die die folgenden Zeilen enthält:Aggregat Linien und zusammenzufassen Spalte

01323874;291874;-;000000000000003030;2511011999;-;000000000000000000 
01323874;291874;-;000000000012920840;2511011999;+;000002910023874000 
01323872;291872;-;000000000000008750;2511011999;-;000000000000008750 
01323872;291872;+;000000000609396980;   ;+;000000000000000000 
01323778;  ;-;000000000468442930;   ;+;000000000000000000 
01323778;  ;+;000000005166500460;   ;+;000000000000000000 
01323778;  ;-;000000000469421100;2511021000;+;000000000469421100 
01323778;291778;-;000000000361156930;2511021000;-;000000000361156930 
01323778;  ;-;000000000186088530;2511021000;+;000000000186088530 
01323778;291778;-;000000000017602470;2511021000;-;000000000017602470 

Ich mag Linien aggregieren auf der Grundlage der ersten Spalte:

Summe der Werte der Spalte nach oben 4, unter Berücksichtigung des Vorzeichens (+/-) in Spalte 3.

Summe der Werte von Spalte 7 unter Berücksichtigung des Vorzeichens (+/-) in Spalte 6.

01323874;291874;-;000000000012923871;2511011999;+;000002910023874000 
01323872;291872;+;000000000609388230;2511011999;-;000000000000008750 
01323778;291778;+;000000003663788500;2511021000;+;000000000276750230 

Es ist mir gelungen, eine gut formatierte Zeilen zu generieren, aber konnte keine Möglichkeit finden, sie zu aggregieren.Ihre Hilfe wird sehr geschätzt.

+1

Und was haben Sie versucht, so weit? – sjsam

+0

Geben Sie zuerst den Code ein, den Sie bereits erstellt haben. –

+1

was ist mit den Spalten 2 und 5? –

Antwort

4
kent$ cat f 
01323874;291874;-;000000000000003030;2511011999;-;000000000000000000 
01323874;291874;-;000000000012920840;2511011999;+;000002910023874000 
01323872;291872;-;000000000000008750;2511011999;-;000000000000008750 
01323872;291872;+;000000000609396980;   ;+;000000000000000000 
01323778;  ;-;000000000468442930;   ;+;000000000000000000 
01323778;  ;+;000000005166500460;   ;+;000000000000000000 
01323778;  ;-;000000000469421100;2511021000;+;000000000469421100 
01323778;291778;-;000000000361156930;2511021000;-;000000000361156930 
01323778;  ;-;000000000186088530;2511021000;+;000000000186088530 
01323778;291778;-;000000000017602470;2511021000;-;000000000017602470 

Ausgang

kent$ awk -F';' '{a[$1]=(1*$2?$2:a[$1]); b[$1]+=$3=="-"?-$4:$4; 
        c[$1]=(1*$5?$5:c[$1]); d[$1]+=$6=="-"?-$7:$7} 
     END{for(x in a) 
       printf "%s;%s;%s;%018d;%s;%s;%018d\n", 
         x,a[x], 
         (b[x]>0?"+":"-"),(b[x]<0?-b[x]:b[x]),c[x], 
         (d[x]>0?"+":"-"),(d[x]<0?-d[x]:d[x])}' f 
01323872;291872;+;000000000609388230;2511011999;-;000000000000008750 
01323778;291778;+;000000003663788500;2511021000;+;000000000276750230 
01323874;291874;-;000000000012923870;2511011999;+;000002910023874000 
+0

Nur für mein persönliches Wissen - was ist der Zweck von '1 *' drin? – fzd

+1

@fzd Sie werden sehen, wenn Sie es aus den Codes entfernen. es filterte die schwarze, aber nicht leere Saite heraus. wie '" "' – Kent

+0

@kent es funktioniert gut danke aber es behandelt nicht den Fall, wenn Spalte 2 oder 5 nur Leerzeichen enthält. Zum Beispiel bekomme ich '01323872; 291872; +; 000000000609388230 ;; -; 000000000000008750', aber es sollte' 01323872; 291872; +; 000000000609388230; BLANK SPACE; -; 000000000000008750'' – technopathe

0

awk Lösung:

awk -F';' 'function get_sign(n){ 
       return (n<0)? "-":"+" 
      } 
      { 
       a[$1]+=int($3$4); b[$1]+=int($6$7); 
       if ($2*1) fld2[$1]=$2; if ($5*1) fld5[$1]=$5 
      } 
      END{ 
       for(i in a) print i, fld2[i], get_sign(a[i]), 
       sprintf("%018d",(a[i]>0)? a[i]:a[i]*-1), fld5[i], get_sign(b[i]), 
       sprintf("%018d",(b[i]>0)? b[i]:b[i]*-1) 
      }' OFS=';' file 

Der Ausgang:

01323872;291872;+;000000000609388230;2511011999;-;000000000000008750 
01323778;291778;+;000000003663788500;2511021000;+;000000000276750230 
01323874;291874;-;000000000012923870;2511011999;+;000002910023874000 

  • function get_sign(n) { ... } - Funktion, die definieren, ob das numerische Argument n positiv oder negativ ist und gibt die entsprechenden Zeichen
+0

funktioniert gut, aber es funktioniert nicht, wenn Spalte 2 oder 5 nur Leerzeichen enthält. Zum Beispiel bekomme ich '01323872; 291872; +; 000000000609388230 ;; -; 000000000000008750', aber es sollte' 01323872; 291872; +; 000000000609388230; BLANK SPACE; -; 00000000000000008750' – technopathe

+0

@technopathe, das ist nicht wahr. Ich habe diesen Fall getestet, wenn die zweite Spalte nur Leerzeichen enthält und es mich anspricht: '01323872 ;; +; 000000000609388230; 2511011999; -; 000000000000008750 01323778 ;; +; 000000003663788500; 2511021000; +; 000000000276750230 01323874 ;; - ; 000000000012923870; 2511011999; +; 000002910023874000 'wie erwartet – RomanPerekhrest

+0

Eigentlich habe ich lieber den weißen Raum auf diese Weise gedruckt; *********; als dieser Weg ;; * bezieht sich auf Leerraum – technopathe

Verwandte Themen