teratail header banner
teratail header banner
質問するログイン新規登録
AWK

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

Q&A

解決済

3回答

5583閲覧

2つのファイルを結合

DaichiYasuda

総合スコア173

AWK

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

0グッド

0クリップ

投稿2017/05/02 12:39

0

0

data1.csv

csv

1お花茶屋駅 30429 2お台場海浜公園駅 14612 3ときわ台駅 45628 4テレコムセンター駅 12112 5芦花公園駅 13810

data2.csv

csv

1お花茶屋駅 2お台場海浜公園駅 3ときわ台駅 4テレコムセンター駅 5阿佐ヶ谷駅 6芦花公園駅

data3.csv

csv

1お花茶屋駅 30429 2お台場海浜公園駅 14612 3ときわ台駅 45628 4テレコムセンター駅 12112 5阿佐ケ谷駅 6芦花公園駅 13810

data1とdata2ファイルを結合してdata3のように結合したいですが
どのようにすればよろしいでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

第一列でソートされているようなので、join一発です。

Bash

1join -a 2 data1.csv data2.csv > data3.csv

ソートされていなくて、元の順序を保たないといけない場合は面倒です。
#追記
そう面倒でも無いですね。何で面倒と思ったんだろう。

Bash

1awk 'F==0{a[$1]=$2;next}{print $1 "\t" a[$1]}' data1.csv F=1 data2.csv > data3.csv

投稿2017/05/02 13:00

編集2017/05/02 14:04
otn

総合スコア86360

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

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

DaichiYasuda

2017/05/02 15:37

ありがとうございます ただこれですとdata2にはある阿佐ヶ谷駅がdata3にはありません どうしたらよろしいでしょうか?
otn

2017/05/02 22:58 編集

> ただこれですとdata2にはある阿佐ヶ谷駅がdata3にはありません それは何かタイプミスがあります。もう一度よく見て実行してください。 -a 2 は指定してますか?ファイルの順番を間違っていませんか?
DaichiYasuda

2017/05/04 00:27

タイプミスは何度も確認しましたが、data2にある行が消えてしまいます
otn

2017/05/04 05:36 編集

-a 2 を指定し忘れ、もしくは、data1.csv と data2.csv の指定を逆にした、としか思えない現象です。 各ファイルの中のデータは、質問文の物と全く同じですよね?
DaichiYasuda

2017/05/04 16:51

これはソートされてないとだめですかね。 実際のファイルはdata2に480行。data1に441行あります
otn

2017/05/04 23:00

joinコマンドはソートが前提です。 ソートされていない場合は、追記のawkを使ってください。
DaichiYasuda

2017/05/05 01:21

追記のawkを使ってもうまくいきませんでした。。。
otn

2017/05/05 02:09

何がどう上手く行かないのでしょうか? 質問のデータと全く違う形式のデータを扱っているとか? ファイル名がcsvとなっていますが、質問のデータのようにタブでなく、カンマで区切られているとか?
DaichiYasuda

2017/05/05 02:09

ソートしてjoinで区切り文字を,に指定したらうまくいきました
otn

2017/05/05 02:14

カンマ区切りでしたか。ファイル名がおかしいとは思ったのですが、質問文データはタブ区切りに見えますよ。 カンマ区切りなら、awk -F, '~~' です。
DaichiYasuda

2017/05/05 02:24

すいませんでした。。。
guest

0

bash の連想配列でかいてみました。

イメージ説明

参考情報

a.sh

sh

1#!/usr/local/bin/bash 2 3IFS=$' ' 4 5declare -A assoc 6while read -r -a array 7do 8 assoc["${array[0]}"]="${array[1]}" 9done < data1.txt 10 11while read -r -a key 12do 13 echo "${key} ${assoc[${key}]}" 14done < data2.txt 15

投稿2017/05/03 14:00

katoy

総合スコア22328

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

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

0

AWK

1#!/usr/bin/awk -f 2function registerStation(station, stationIndex) { 3 for (stationIndex = 0; stationIndex < stationCount; stationIndex++) { 4 if (stationList[stationIndex] == station) { 5 return stationIndex; 6 } 7 } 8 9 stationList[stationCount++] = station; 10 return stationCount; 11} 12 13 14{ 15 station = $1; 16 registerStation(station); 17 18 passengers = $2; 19 20 passengersAtStation[station] = passengers; 21} 22 23 24END { 25 for (stationIndex = 0; stationIndex < stationCount; stationIndex++) { 26 station = stationList[stationIndex]; 27 printf("%s\t%s\n", station, passengersAtStation[station]); 28 } 29}

bash

1chmod a+x joinStationList.awk # 上記ファイル 2./joinStationList.awk data2.csv data1.csv > data3.csv

投稿2017/05/02 13:17

編集2017/05/02 19:27
naomi3

総合スコア1105

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

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

DaichiYasuda

2017/05/05 01:36

2つのファイルの総数が表示されてしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問