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

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

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

AWK

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

Q&A

解決済

3回答

623閲覧

特定のフィールドの文字列と、数字の合計値を結合させたい

nana_1259

総合スコア7

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

AWK

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

0グッド

0クリップ

投稿2023/07/14 16:57

編集2023/07/14 17:16

業務で初めてスクリプトを作成してます。
調べてもどうしても分からず、力をお借りしたいです。

以下のような2行のテキストを、

AB  CD  "EF"."GH"  12  1000を、実行します AB  KL  "EF"."IJ"  23  50を、実行します

このように1行で出力したいです。

EF,1050

具体的には、
・第3フィールドと、第5フィールドの数字のみ抜き出す
・1.2行目の第3フィールドの文字列として重複する部分(EF)は、一つとしてカウントしたい
・さらに第3フィールドの文字列として重複する部分(EF)以外は除外したい
・第5フィールドの数字は1.2行目足した数で出力させたい
・最後に、結果を「,」で区切りたい

説明が下手で申し訳ございません。
どなたか教えていただけると大変うれしいです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

※ 質問文にあるテキストデータは U+3000(全角スペース)で区切られているので、セパレータに " " を入れています。不要であれば取り除いて下さい。

bash

1awk -F '[ \t"を ]+' -vOFS=, '{sum[$3]+=$(NF-1)}END{for(k in sum) print k,sum[k]}' data.dat 2EF,1050

投稿2023/07/15 01:31

編集2023/07/15 01:49
melian

総合スコア20673

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

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

nana_1259

2023/07/15 04:20 編集

コメントありがとうございます。 問題が解決し、大変感謝しております! ただ、私の質問に不備があり、追加でもう一点質問させていただきたいです。 質問内容に以下のように記載されてますが、 ================================= AB  CD  "EF"."GH"  12  1000を、実行します AB  KL  "EF"."IJ"  23  50を、実行します =============================== 実際はもう少しデータが多く、下記のように第一フィールド(AB)はすべて同一の文字列ではなく、異なる文字列(QQ、AS)も含まれております。 そして、第一フィールドも表示させたいです。 =============================== AB  CD  "EF"."GH"  12  1000を、実行します AB  KL  "EF"."IJ"  23  50を、実行します QQ  SS  GG      77  55を、実行します AS  WW  CC      20  10を、実行します =============================== いただいたコマンドを第一フィールドも表示させるようprint $1,k,sum[k]に編集し実行したところ、 第一フィールドは複数の文字列があるうちの一つのみが抽出されてしまいます。 以下を =============================== AB  CD  "EF"."GH"  12  1000を、実行します AB  KL  "EF"."IJ"  23  50を、実行します QQ  SS  GG      77  55を、実行します AS  WW  CC      20  10を、実行します =============================== このようにしたいですが、 =============================== AB,EF,1050 QQ,GG,55 AS,CC,10 =============================== このように出力されます。 =============================== AB,EF,1050 =============================== ABだけではなく、QQやASも出力させたい場合のコマンドもご教示いただけますでしょうか? 貴重なお時間を頂戴し申し訳ございません。
melian

2023/07/15 04:54

その場合は、 awk -F '[ \t"を ]+' -vOFS=, '{tag[$3]=$1;sum[$3]+=$(NF-1)}END{for(k in sum) print tag[k],k,sum[k]}' data.dat として見て下さい。
nana_1259

2023/07/15 07:58

お返事ありがとうございます。 何度も大変申し訳ございませんが、よろしければ再度教えていただけると幸いです。 ご教示いただいたコマンドを実行する前の状況は以下になります。 =============================== "AB" "EF":"GH" 0 KB 10000を、実行します =============================== いただいたコマンドを実行したところ、第1フィールドは表示されましたが、次は第4フィールドがうまく計算がされずすべて0で表示されてします。 フィールドがずれているのかと思い変えて実行してみたりもしましたが、そうすると必要な情報が出力されず、フィールドは合ってそうです。 何度も大変恐縮ですが、ご教示いただけると嬉しいです
melian

2023/07/15 08:10

第一フィールドがダブルクォートで囲まれているのでフィールド番号がずれてしまっています。 入力データが以下の様になっていると仮定して、 "AB" "EF":"GH" 0 KB 10000を、実行します "AB" "EF"."IJ" 23 KB 50を、実行します 以下のスクリプトを実行します。 awk -F '[ \t"を ]+' -vOFS=, '{tag[$3]=$2;sum[$3]+=$(NF-1)}END{for(k in sum) print tag[k],k,sum[k]}' data.dat AB,EF,10050
nana_1259

2023/07/15 08:45 編集

お返事ありがとうございます。 入力データは提示していただいた内容で合っておりますが、やはり上記のコマンドを実行しても、結果は以下のようになってします。 AB,EF,0 お時間をたくさん取らせてしまい申し訳ございません。 もう少し自分で調べてみます。 ここまで丁寧にご教示いただきとても助かりました!求めていた形にだいぶ近づけてきたので大変感謝しております。ありがとうございます。
melian

2023/07/15 08:49

考えられる原因としては入力データの文字コードが UTF-8 ではなく Shift-JIS になっている場合です。その場合、「を」で分割できなくなるので合計値が 0 になります。問題がなければ入力データの文字コードを UTF-8 にして試してみて下さい。
nana_1259

2023/07/15 10:23

なるほど…SJISだったのでUTF8にしたところできました!!大変ありがとうございました><
guest

0

フィールドの切り出しに sed を使います。awk は使わない例になります。
以下のようなテキストファイル data.txt があるとします。

data.txt

text

1VU EE "EF"."TC" 2461 25を、実行します 2XC DX "MN"."PX" 157 59を、実行します 3ZP IN "PQ"."QD" 271 18を、実行します 4BC ED "PQ"."UT" 3483 24を、実行します 5IL SK "UV"."LB" 4338 42を、実行します 6JZ ON "EF"."HK" 76 4832を、実行します 7PD IO "MN"."QA" 4747 4306を、実行します 8IA EX "MN"."FW" 390 56を、実行します 9FC CY "EF"."VQ" 239 57を、実行します 10SE FQ "MN"."YQ" 86 223を、実行します 11GM SP "PQ"."XD" 2735 70を、実行します 12TD GL "UV"."EX" 112 15を、実行します 13SK IY "MN"."JP" 273 339を、実行します 14KI DZ "EF"."SD" 255 3081を、実行します 15MX EA "MN"."CF" 341 4349を、実行します 16ID RO "EF"."IP" 55 335を、実行します 17NF PD "UV"."TE" 43 2149を、実行します 18MZ YH "PQ"."PB" 4244 203を、実行します 19PM VE "MN"."TF" 77 2063を、実行します 20BI EW "MN"."ME" 82 4289を、実行します

たとえば1行目は次の5個のフィールドが半角スペース1個で区切られたものです。

  • VU
  • EE
  • "EF"."TC"
  • 2461
  • 25を、実行します

以下は上記の data.txt を標準入力から読み込んで、質問にある集計をした結果を出力するスクリプト例です。

main.sh

shell

1#!/bin/bash 2 3while read LINE; do 4 sed -E 's/^[A-Z]{2} [A-Z]{2} "([A-Z]{2})"\."[A-Z]{2}" [0-9]+ ([0-9]+).+$/\1 \2/' <<< $LINE 5done | sort | ( 6 7SUB_TOTAL=0 8CURRENT_TAG='_' 9 10while read TAG VALUE 11do 12 if [ $CURRENT_TAG != $TAG ]; then 13 if [ $CURRENT_TAG != '_' ]; then 14 echo $CURRENT_TAG,$SUB_TOTAL 15 fi 16 CURRENT_TAG=$TAG 17 SUB_TOTAL=$VALUE 18 else 19 SUB_TOTAL=$(expr $SUB_TOTAL + $VALUE) 20 fi 21done; 22 23echo $CURRENT_TAG,$SUB_TOTAL 24 25)

実行例

$ chmod +x main.sh $ main.sh < data.txt

EF,8330
MN,15684
PQ,315
UV,2206

投稿2023/07/14 22:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nana_1259

2023/07/15 08:02

コメントありがとうございます。 大変分かりやすく、丁寧な説明でとても助かりました! 貴重なお時間を割いてくださり感謝いたします。
guest

0

  • 第3フィールドと第5フィールドの数字のみ抜き出す
  • 第3フィールドが一致するものについては、第5フィールドの値を合計する。

やりたいことは上記で認識正しいでしょうか? であれば以下のようなスクリプトで実現できるかと思います (input.txtが対象のテキストです)

bash

1cat input.txt | awk 'match($0, /^[A-Z]+\s+[A-Z]+\s+"([A-Z]+)"\."[A-Z]+"\s+[0-9]+\s+([0-9]+)を、実行します$/, m){arr[m[1]]+=m[2]} END{for(key in arr) printf "%s,%d\n",key,arr[key]}'

投稿2023/07/14 20:24

neko_the_shadow

総合スコア2349

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

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

nana_1259

2023/07/15 08:05

コメントありがとうございます。 そのような実行方法もあったのですね!勉強になります。 とても分かりやすい説明、そして貴重なお時間を割いてくださり感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問