2017-01-17 10 views
1

У меня есть файл, в котором мне нужно группировать столбцы 1,2 & 3, суммировать столбец 7, получить счетчик и получить столбец 4 и 5, имеющий последнее время и дату (столбец 6).Групповые столбцы и получить определенное значение в оболочке

FILE.TXT

AAA,BBB,CCC,OOO,PPP,20170117012006,12 
XXX,YYY,MMM,OOO,PPP,20170117012006,13 
AAA,BBB,CCC,III,TTT,20170117020006,14 
XXX,YYY,MMM,OOO,PPP,20170117022067,10 

ЗАПЛАНИРОВАННЫЕ

AAA,BBB,CCC,III,TTT,26,2 
XXX,YYY,MMM,OOO,PPP,23,2 

У меня есть код здесь, но только группы столбцов 1,2,3.

awk 'BEGIN { FS=OFS=SUBSEP=","}{arr[$1,$2,$3]+=$7 }{arr2[$1,$2,$3]++}END {for (i in arr) print i,arr[i],arr2[i]}' FILE.txt 

ответ

0

Используйте дополнительные массивы для хранения последней информации для каждой группы.

awk 'BEGIN { FS=OFS=SUBSEP="," } 
    { 
     arr[$1,$2,$3]+=$6; 
     arr2[$1,$2,$3]++; 
     if ($6 > latest[$1,$2,$3]) { 
      latest[$1,$2,$3] = $6; 
      latest_data[$1,$2,$3] = $4 OFS $5; 
     } 
    } 
    END {for (i in arr) print i,arr[i],arr2[i],latest_data[i]}' FILE.txt 
0
awk -F"," '      
{ 
    i=$1","$2","$3 
    if (i in a) { 
     split(a[i],r,",") 
     $7+=r[4]      
     c=r[5]+1     
     if (r[1] > $6) { $4=r[2]; $5=r[3]; $6=r[1] } 
    } else { c=1 } 

    a[$1","$2","$3]=$6","$4","$5","$7","c 

} END { for (i in a) { print i substr(a[i],15) }} 
' file 

AAA,BBB,CCC,III,TTT,26,2 
XXX,YYY,MMM,OOO,PPP,23,2 

Если вы хотите столбцы 1,2 & 3 сортируют, а затем использовать это вместо

END { asorti(a,b); for (i in b) { print b[i] substr(a[b[i]],15) }} 
0

@ User101: Попробуйте выполнить, это даст вам ожидаемый/запрашиваемую выход вместе с тем же последовательность $ 1, $ 2, $ 3 такая же, как и в файле Input_file.

awk -F, 'FNR==NR{A[$1,$2,$3]=A[$1,$2,$3]?A[$1,$2,$3]+$7:$7;;B[$1,$2,$3]++;next} (($1,$2,$3) in A){$NF="";print $0 A[$1,$2,$3] "," B[$1,$2,$3];delete A[$1,$2,$3]}' OFS=, SUBSUP=, Input_file Input_file 

создание разделителя полей как ",". FNR == NR будет TRUE, когда будет прочитан первый файл. создавая массив с именем A, индекс которого равен $ 1, $ 2, $ 3, и он свяжет значение $ 7 с ним. Создание еще одного массива с именем B, индекс которого также составляет $ 1, $ 2, $ 3 за счет $ 1, $ 2, $ 3.

Затем проверка ($ 1, $ 2, $ 3) в A, если первое, второе, третье поле присутствует в массиве A, если да, то печать текущей строки (последнее поле которой мы сделали как NULL) вместе с массивом A и значения массива B по запросу.

EDIT: Слишком длинное дополнение формы одного вкладыша.

awk -F, 'FNR==NR{ 
       A[$1,$2,$3]=A[$1,$2,$3]?A[$1,$2,$3]+$7:$7; 
       B[$1,$2,$3]++; 
       next 
       } 
       (($1,$2,$3) in A){ 
             $NF=""; 
             print $0 A[$1,$2,$3] "," B[$1,$2,$3]; 
             delete A[$1,$2,$3] 
           } 
     ' OFS=, SUBSUP=, Input_file Input_file