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

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

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

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

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

724閲覧

シェルスクリプトの文字列処理

Dimlos

総合スコア2

シェルスクリプト

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

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2022/10/20 12:31

(true_2347087436712_value1_value2_value3_0315764274_Biabia Kudi_Oto Obong_12102022_1)
(true_2347087436712_490.00_150.00_0.00_0315764274_Biabia Kudi_Oto Obong_12102022_1)

シェルスクリプトで上記文字列のvalue1 value2の数字を加算してvalue3に代入したいと考えています。

小数点の加算なのでbcコマンドだと思うのですが、しばらく試行錯誤したのですがvalue1 value2の抽出すらできません。( sed -e 's/[0-9.]+.[0-9]+//g'だと逆の結果になってしまいました)

どのように処理をすれば無駄な手間を省いて最速で処理できるのでしょうか?(パイプを使って連続処理するのではないかと推測しています)

※MacroDroidのシェルスクリプトなので機能制限があるかもしれません。

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

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

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

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

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

Dimlos

2022/10/21 10:30 編集

()の前後に_が入っていたのですが表示されないようです、そのせいで皆様のご回答と差が出てしまいましたが、自分で吸収いたしました。
guest

回答3

0

ベストアンサー

sed と bc で頑張るなら、例えばこうとか:

shell

1#!/usr/bin/env bash 2 3INPUT='(true_2347087436712_490.00_150.00_0.00_0315764274_Biabia Kudi_Oto Obong_12102022_1)' 4 5FORMULA=$(sed -E "s/^\(true_[0-9]+_([0-9.]+)_([0-9.]+)_.*$/\1+\2/" <<< "$INPUT") # 490.00+150.00 6 7OUTPUT=$(sed -E "s/_0\.00_/_$(bc <<< "$FORMULA")_/" <<< "$INPUT") 8 9echo "$OUTPUT" # (true_2347087436712_490.00_150.00_640.00_0315764274_Biabia Kudi_Oto Obong_12102022_1)

追記

数値としての合計は bc を使い、sed は-e オプションで使って -E オプションを使わないことにし、その替わり cutコマンドを使った方法です。

shell

1#!/usr/bin/env bash 2 3INPUT='(true_2347087436712_490.00_150.00_0.00_0315764274_Biabia Kudi_Oto Obong_12102022_1)' 4 5HEAD=$(echo $INPUT | cut -d_ -f1,2,3,4) # (true_2347087436712_490.00_150.00 6TAIL=$(echo $INPUT | cut -d_ -f6,7,8,9,10) # 0315764274_Biabia Kudi_Oto Obong_12102022_1) 7FORMULA=$(echo $INPUT | cut -d_ -f3,4 | sed -e 's/_/+/') # 490.00+150.00 8SUM=$(echo $FORMULA | bc) # 640.00 9 10RESULT="${HEAD}_${SUM}_${TAIL}" 11 12echo $RESULT # (true_2347087436712_490.00_150.00_640.00_0315764274_Biabia Kudi_Oto Obong_12102022_1) 13

投稿2022/10/20 14:05

編集2022/10/20 15:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Dimlos

2022/10/20 14:24

MacroDroidでもTermuxを使えばそのままのbashが動く可能性があるのですが、できれば使いたく無い手です。 sed -E "s/^\(true_[0-9]+_([0-9.]+)_([0-9.]+)_.*$/\1+\2/"を試してみたのですが上手く動作せず、計算結果を得る事ができませんでした。 bcコマンドなら小数点以下の桁数の増減にも対応できると思うのですが残念です。
退会済みユーザー

退会済みユーザー

2022/10/20 15:53

> sed -E "s/^\(true_[0-9]+_([0-9.]+)_([0-9.]+)_.*$/\1+\2/"を試してみたのですが上手く動作せず、 とのことですがその理由は sed が -Eオプションを受けつけないバージョンのものである可能性があります。 なのでsed を-e オプションで使う例を追記しました。こちらはcutコマンドを使っています。 動作確認は手元のbashで行ってます。
退会済みユーザー

退会済みユーザー

2022/10/20 16:07

> MacroDroidでもTermuxを使えばそのままのbashが動く可能性があるのですが、できれば使いたく無い手です。 なるほどですね。私の回答も質問者さまにbashを使える環境を用意いただくことを要望するものではなく、 1行目の #!/usr/bin/env bash はあくまで「bashで動作確認してみました」という意味合いです。
dameo

2022/10/20 23:58

横から失礼します 昔のbourne shellとsedを思い出しながら書いてみました INPUT='(true_2347087436712_490.00_150.00_0.00_0315764274_Biabia Kudi_Oto Obong_12102022_1)' echo $INPUT FORMULA=`echo $INPUT | sed 's/^(true_[0-9]*_\([0-9.]*\)_\([0-9.]*\)_.*$/\1+\2/'` echo $FORMULA ANSWER=`echo $FORMULA | bc` echo $ANSWER OUTPUT=`echo $INPUT | sed 's/^\((true_[0-9]*_[0-9.]*_[0-9.]*_\)[0-9.]*/\1'$ANSWER'/'` echo $OUTPUT こんなのではどうでしょう? 手元のubuntu環境では動きましたが、MacroDroidではどうでしょうね
Dimlos

2022/10/21 09:42

標準環境では無い為お手間を取らせて申し訳ありません、MacroDroidのシェルスクリプトはBusyBoxの簡易版で色々オミットされているようで折角効率の良い構文をご提示いただいているのにそのままでは動作しません。 そこでご回答のエッセンスを読み取り、試行錯誤しております。どうやら変数への代入が上手くいかないようです。a=1 b=2 echo $(($a+$b))のような簡単な物は動くので頑張ってみます。
Dimlos

2022/10/21 13:04

最終的にこのような形で動作させる事ができました。面倒な案件にも関わらず丁寧に回答して頂きとても助かりました、ありがとうございます。 input='{lv=notification}' head=$(echo $input | cut -d _ -f 1,2,3,4,5) caluculation=$(echo $input | cut -d _ -f 4,5 | sed -e 's/_/+/' | bc) tail=$(echo $input | cut -d _ -f 7,8,9,10,11,12) result="${head}_${caluculation}_${tail}" echo $result
退会済みユーザー

退会済みユーザー

2022/10/21 13:13

解決されたようですね、よかったです 👏 @dameoさん、フォローありがとうございます。
guest

0

shiketa さんの回答とほとんど同じですが。

bash

1$ cat in.txt 2(true_2347087436712_490.00_150.00_0.00_0315764274_Biabia Kudi_Oto Obong_12102022_1) 3 4$ cat in.txt | awk -F_ '{ printf "%s_%s_%s_%s_%.2f_%s_%s_%s_%s_%s\n", $1, $2, $3, $4, $3+$4, $6, $7, $8, $9, $10 }' 5(true_2347087436712_490.00_150.00_640.00_0315764274_Biabia Kudi_Oto Obong_12102022_1) 6 7$ cat in.txt | awk -F_ 'BEGIN{OFS="_"} {$5=$3+$4; print}' 8(true_2347087436712_490.00_150.00_640_0315764274_Biabia Kudi_Oto Obong_12102022_1)

投稿2022/10/20 13:15

arcxor

総合スコア2859

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

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

Dimlos

2022/10/20 14:04

回答ありがとうございます、MacroDroidという特殊な環境化でのスクリプトなのでそのまま入力しても動作しませんでした。 修正を試みたのですが動作させる事ができませんでした、shiketaさんの追加の回答で何とか小数点以下2桁の加算が出来るようになりました。
guest

0

awk案件かな。

( cat <<EOD (true_2347087436712_490.00_150.00_0.00_0315764274_Biabia Kudi_Oto Obong_12102022_1) (true_2347087436712_111.11_222.22_0.00_0315764274_Biabia Kudi_Oto Obong_12102022_1) EOD ) |\ awk -F_ 'BEGIN{ OFS="_" }{ print($1, $2, $3, $4, $3 + $4, $6, $7, $8, $9, $10) }'
(true_2347087436712_490.00_150.00_640_0315764274_Biabia Kudi_Oto Obong_12102022_1) (true_2347087436712_111.11_222.22_333.33_0315764274_Biabia Kudi_Oto Obong_12102022_1)

arcxorさんの回答を参考に。こうも書けますね。

... awk -F_ 'BEGIN{ OFS="_" }{ print($1, $2, $3, $4, sprintf("%.2f", $3 + $4), $6, $7, $8, $9, $10) }'

投稿2022/10/20 12:53

編集2022/10/20 13:44
shiketa

総合スコア3971

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

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

Dimlos

2022/10/20 14:01

回答ありがとうございます、MacroDroidという特殊な環境化でのスクリプトなのでそのまま入力しても動作しませんでしたが修正を加えてなんとか動作させる事ができました。 最初は小数点以下の計算が上手く行きませんでしたが追加された回答を元にsprintfを使ってみた所上手くいったようです。但し、小数点以下の桁数が変化した場合は2f指定なので反映されないという認識でよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

同じタグがついた質問を見る

シェルスクリプト

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

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。