🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

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

AWK

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

Q&A

解決済

2回答

1147閲覧

awkで求めた結果を、元の文字列内にペーストする方法?

candycorn

総合スコア9

bash

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

AWK

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

0グッド

1クリップ

投稿2020/12/19 08:36

###背景
以下のようなデータがあり、

bash

1$ cat test.txt 2ABC_01 | 1 | 0.643 | 0.683 | abcdefghijk 3DEFG_02 | 1 | 0.820 | 0.750 | lmnopqrstuvwxyz 4HIJK_03 | 1 | 0.779 | 0.712 | abiugdbshwkj 5LMN_Q1_04 | 3 | 0.999 | 0.966 | ufbeiuybdfgijrs 6OPQ_Q2 | 4 | 0.939 | 0.920 | mjgbgbisgys

1列目の「_」以降をすべて削除したく、以下のようなコードを使用しました。

bash

1$ awk '{sub("_.*", ""); print $0;}' test.txt 2ABC 3DEFG 4HIJK 5LMN 6OPQ

###質問
しかし今度は以下のように、awkで得られた文字列を元のデータの1列目の横に2列目として追加しなければいけなくなったのですが、やり方がわかりません。なるべく、上記に示したawkのコードに付け足す形で完結させたいのですが、知恵を貸していただけると嬉しいです。どうぞよろしくお願いいたします。

ABC_01,ABC DEFG_02,DEFG HIJK_03,HIJK LMN_Q1_04,LMN OPQ_Q2,OPQ

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

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

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

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

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

guest

回答2

0

sh

1awk '{a=$1;sub("_.*","",a);print $1 "," a}'

投稿2020/12/19 16:56

otn

総合スコア85882

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

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

0

ベストアンサー

後方参照して置換する必要があるので、subではなくgensubを使って、

awk '{print gensub(/^([^_]*)_([^ ]*).*$/, "\1_\2,\1", "1")}' test.txt

とします。()で囲まれた部分2カ所がキャプチャされ、置換文字列の\1\2がそれぞれの内容に置き換わります。

result

1ABC_01,ABC 2DEFG_02,DEFG 3HIJK_03,HIJK 4LMN_Q1_04,LMN 5OPQ_Q2,OPQ

投稿2020/12/19 08:52

Daregada

総合スコア11990

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

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

candycorn

2020/12/19 09:21 編集

gensubが使えるとのこと、ありがとうございます。 早速上記のコマンドを走らせたところ、 awk: calling undefined function gensub input record number 1, file test.txt source line number 1 と出力されてしまいました。 これはMacデフォルトのawkがgensubに非対応ということでしょうか? (環境はMacで、Darwin Kernel Version 20.1.0、bash 5.0.17を使用しています)
Daregada

2020/12/19 10:38

gensubはGNU awkのバージョン3以降でしか使えません。 ご自分の使っているawkのバージョンを「awk -V」とか「awk --version」で調べてください。
Daregada

2020/12/19 10:44

sedでもGNU sedなら「sed -r 's/^([^_]*)_([^ ]*).*$/\1_\2,\1/' test.txt」で同じ結果が得られますが、Macに付いてくるsedだとどうかな……
candycorn

2020/12/20 06:00

awkのバージョンを調べたところ2でしたが、sedの方で無事動きました!大変親切なご回答、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問