フィールドの切り出しに 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/15 04:20 編集
2023/07/15 04:54
2023/07/15 07:58
2023/07/15 08:10
2023/07/15 08:45 編集
2023/07/15 08:49
2023/07/15 10:23