2016-11-17 3 views
0

私は、LinuxおよびAWKの使用に非常に新しいですし、私の次の質問のための答えを見つけることができませんでした:gawkははっきりと合計欄

は私がAWKを使用したいと私のファイルには、そのように構成されています

Date ID Size 
2016-11-09 688 47 
2016-11-09 688 56 
2016-11-09 31640 55 

ここで、日付とIDを持つ各行のサイズを集計し、.csvファイルにエクスポートします。 ファイルには、そのようになります。私は自分でそれを行う方法を見つけ出すことができなかったので、

Date,ID,Size 
2016-11-09,688,103 
2016-11-09,31640 55 

は、私は本当にあなたに感謝し、あなたの助けを必要としています。

+1

解決に努力してください。同様の質問を見つけて回答を試してみましたか? – fedorqui

+0

あなたは本当にこのような何かをbashやawkでしたいですか?あなたは、この種類のもののために設計されたSQLを使用することができます。 – dood

+0

私はこれをSQLで知っていますが、ファイルが大きすぎるためこの場合はできません。 これを解決しようとしましたが、フィールドを配列に入れて、forループを使って区切ることしかできませんでした。 可能@JohnDro 688 2016年11月10日44 1661 2016年11月9日46 31640 2016年11月9日55 1661 2016年11月10日46 688 2016年11月9日44 – JohnDro

答えて

2

あなたの入力は本当に、あなたは、この使用する必要がありますあなたのサンプルのように日付とIDでソートされている場合:

$ cat tst.awk 
BEGIN { OFS="," } 
NR==1 { $1=$1; print; next } 
{ curr = $1 OFS $2 } 
(curr != prev) && (NR > 2) { print prev, sum; sum=0 } 
{ prev = curr; sum += $3 } 
END { print prev, sum } 

$ awk -f tst.awk file 
Date,ID,Size 
2016-11-09,688,103 
2016-11-09,31640,55 

ではなく、メモリ内のファイル全体を保存します。この方法では、入力と同じ順序で出力が生成されますが、ENDセクションのいずれかのfor .. in ..ループでは、出力がランダム(ハッシュ)順に出力されます。

+0

ハードコーディング部分 'awk 'を扱っている' OFS'配列添え字を修正しました。BEGIN {OFS = "、"} NR = 1 {print; next} {k = $ 1 OFS $ 2; – Inian

+0

最初の 'print'の前に' $ 1 = $ 1; 'を追加してawkを書くようにしました。フィールド間でOFSを使用して現在のレコードを再コンパイルします。これを 'NR == 1 '(二重' = ')にして、それを代入ではなく比較します。基本的に私のスクリプトにあるものを正確に作ります。 'NR == 1 {$ 1 = $ 1;印刷する;次の} '。 –

+1

これを実現し、心に留めておくので、あなたの良いもののひどく構成された解決策を投稿したくありませんでした! :) – Inian

関連する問題