質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

1回答

3150閲覧

awkで重複している行の足し算

DaichiYasuda

総合スコア173

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2017/04/29 04:27

csv

1新木場駅 135,180 2新木場駅 96,852 3新木場駅 52,325 4新小岩駅 141,760 5新高円寺駅 33,392 6新桜台駅 6,407 7新柴又駅 3,660 8新宿駅 1,485,666 9新宿駅 714,949 10新宿駅 474,552 11新宿駅 257,455 12新宿駅 220,154

上記のような駅の乗降車数のcsvファイルが有ります。
駅名が同じものの乗降車数を足して重複をなくしたいのですが、awkの書き方がわかりません。

希望の出力結果

csv

1新木場駅 284,357 2新小岩駅 141,760 3新高円寺駅 33,392 4新桜台駅 6,407 5新柴又駅 3,660 6新宿駅 3152776

教えていただけますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

連想配列を使っていますので、順番通りに駅名が出ませんけど、もう少し頑張ればできるでしょう。
3桁区切りも同様。

bash

1#!/usr/bin/awk -f 2{ 3 station = $1; 4 5 passengers = $2; 6 gsub(/,/, "", passengers); 7 8 passengersAtStation[station] += passengers; 9} 10 11END { 12 for (station in passengersAtStation) { 13 printf("%s\t%d\n", station, passengersAtStation[station]); 14 } 15}

解決済になっていますけど、駅名を出現順に、乗降客数を3桁区切りで表示するバージョンを示しておきます。

bash

1#!/usr/bin/awk -f 2function putCommaAtEvery3Digits(input, output) { 3 for (output = ""; input >= 1000; input = int(input / 1000)) { 4 output = sprintf(",%03d", input % 1000) output; 5 } 6 output = input output; 7 8 return output; 9} 10 11 12function registerStation(station, stationIndex) { 13 for (stationIndex = 0; stationIndex < stationCount; stationIndex++) { 14 if (stationList[stationIndex] == station) { 15 return stationIndex; 16 } 17 } 18 19 stationList[stationCount++] = station; 20 return stationCount; 21} 22 23 24{ 25 station = $1; 26 registerStation(station); 27 28 passengers = $2; 29 gsub(/,/, "", passengers); 30 31 passengersAtStation[station] += passengers; 32} 33 34 35END { 36 for (stationIndex = 0; stationIndex < stationCount; stationIndex++) { 37 station = stationList[stationIndex]; 38 printf("%s\t%s\n", station, putCommaAtEvery3Digits(passengersAtStation[station])); 39 } 40}

投稿2017/04/29 05:27

編集2017/04/29 07:02
naomi3

総合スコア1105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DaichiYasuda

2017/04/29 05:30

ファイル名をどこで指定したらよろしいでしょうか?
DaichiYasuda

2017/04/29 05:46

cat で出力して実行できました! ありがとうございました
naomi3

2017/04/29 06:07

もう実行できているとのことが、ちなみに、awkスクリプトになっているので、このスクリプトファイルに実行権をつければ、コマンド名としてこのファイルを、引数としてcsvファイル(?)を指定すればOKです。
DaichiYasuda

2017/04/29 11:51

ありがとうございました! awkはどうやって覚えられました??
naomi3

2017/04/29 14:20

「sed/awk」という本です。かなり昔になりますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問