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

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

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

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

Q&A

解決済

2回答

1181閲覧

ある一つの列で同じ値を持つもの同士を1行にまとめるawkコマンド

flushlever

総合スコア1

AWK

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

0グッド

0クリップ

投稿2020/10/04 07:53

前提・実現したいこと

awkコマンドを使ってテキストファイルの加工を行っています。
以下質問

「ある一つの列で同じ値を持つもの同士を1行にまとめるコード」
https://teratail.com/questions/160950

とほぼ同じことを実現したいのですが、若干条件が違います。
どのようなコマンドにすればよいか教えていただければと思います。
よろしくお願いします。

条件:
・1列目に同じ値をもつ行を、元のファイルでの順番を維持したまま1行にまとめる
・1行にまとめられたもの同士はスペースで区切られる
・まとめたあとは1列目の値は残したい

log.txt(元ファイル)

aaaa abc aaaa def aaaa ghi bbbb ABC cccc DEFG dddd HIJ dddd KLMN

log2.txt(加工後ファイル)

aaaa abc,def,ghi bbbb ABC cccc DEFG dddd HIJ,KLMN

発生している問題・エラーメッセージ

参考にした質問の回答欄を元にコマンドを作ってみたのですがすべてddddになってしまいました。
$ cat log.txt | awk 'BEGIN{FS=" ";OFS=" ";}{k=$1;v=$2","$3;if(b[k]){b[k]=b[k]" "v}else{a[i++]=k;b[k]=v}}END{for(i in a){print $1,b[a[i]]}}' > log2.txt

dddd abc,def,ghi dddd ABC dddd DEFG dddd HIJ,KLMN

補足情報(FW/ツールのバージョンなど)

CentOS6です。

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

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

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

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

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

guest

回答2

0

・1行にまとめられたもの同士はスペースで区切られる

と書いてあるけど、例もコードもカンマ区切りみたいなのでカンマ区切りとして、

行の順が順不同で良いなら、

sh

1awk '{b[$1]=b[$1] "," $2}END{for(k in b) print k,substr(b[k],2)}' log.txt

1列目の順序を保つなら、

sh

1awk '{if($1 in b){b[$1]=b[$1] "," $2}else{b[$1]=$2;a[n++]=$1}}END{for(i=0;i<n;i++)print a[i],b[a[i]]}' log.txt

投稿2020/10/04 09:20

otn

総合スコア85901

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

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

flushlever

2020/10/04 09:23

回答いただきありがとうございます! substrの表現も大変参考になりました。勉強させていただきます!
guest

0

自己解決

自己解決しました。
以下コマンドでできました。

$ cat log.txt | awk 'BEGIN{FS=" ";OFS=" ";}{k=$1;v=$2","$3;if(b[k]){b[k]=b[k]" "v}else{a[i++]=k;b[k]=v}}END{for(i in a){print a[i],b[a[i]]}}' > log2.txt

投稿2020/10/04 09:05

flushlever

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問