2017-01-17 12 views
1

私は、列1,2をグループ化し、列7を集計し、カウントを取得し、最新の日時(列6)を持つ列4と5を取得する必要があるファイルを持っています。列をグループ化してシェル内の特定の値を取得する

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は、この代わりに

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

を使用したい場合は次のことを試してみてください、それは同じと一緒に/あなたが期待される要求された出力が得られます$ 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になります。インデックスが$ 1、$ 2、$ 3の配列Aを作成し、$ 7の値を連結します。 $ 1、$ 2、$ 3の数を取るためにインデックスが$ 1、$ 2、$ 3であるBという配列をもう1つ作成する。

次に、配列Aに1番目、2番目、3番目のフィールドがあるかどうか($ 1、$ 2、$ 3)が存在するかどうかをチェックし、現在の行(最後のフィールドはNULLにしています)要求ごとに配列Bの値を返します。

EDIT:解決策の1つではないライナーフォームを追加することができました。

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 
関連する問題