• ベストアンサー

unixのコマンドで+を付けたい

unixのたとえば、 grep "#E200#" file1|cut -d# -f1 とかで 43 78 23 17 とかの数字を出してきて、これを 43+78+23+17 になるように+をつけるには どんなコマンドがよろしいでしょうか? trを使ってなんかできませんでしょうか? これができたら、TOTAL=43+78+23+17でコマンド代入 にして bc scale=2 $TOTAL 161 quit したいのですが。 よろしくお教えください。(unix 超初心者です)

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.6

file1の中の改行コードがCRLF(Windows)と、LF(Linux)が混在してるんですかね。 grep "#E200#" file1|cut -d# -f1|tr '\n' +|tr -d '\r'|sed 's/+$//' と、CR を削除してみましょう。

glotte
質問者

お礼

ご心配かけて申し訳ありませんでした。 どうもsedが相性悪いようで。 work=`grep "$empid#" file1|cut -d# -f1|tr '\n' +` echo $work|sed 's/+$//' でやってみたら、最後の+が消えました。 それで echo $work|sed 's/+$//'|bc にしましたら足し算をしてくれました。 お骨折りありがとうございました。

glotte
質問者

補足

Dame desu. nanimo dete kimasen. tadaima america no bousho no computer de yattemasunode roma-zi nandesuga.

その他の回答 (5)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

#4です。 >ここのところがうまく作用しません sed 's/+$//' 具体的な現象を書いてください。 grep "#E200#" file1|cut -d# -f1|tr '\n' + で、数+数+数+ となって、 grep "#E200#" file1|cut -d# -f1|tr '\n' +|sed 's/+$//' で、数+数+数 となるのが正常です。 それぞれどうなるのですか?

glotte
質問者

お礼

ひょっとして(実際は、バリアブルを使ってました) empid=200 -bash-3.2$ grep "$empid#" file1|cut -d# -f1|tr '\n' + 40+32+32+11+-bash-3.2$ -bash-3.2$ grep "$empid#" file1|cut -d# -f1|tr '\n' +|sed 's/+$//' 200をバリアブルにした$とsedのアンカーの$を何かコマンドが勘違いしてるのでしょうか?

glotte
質問者

補足

ご心配していただき感謝してます。 -bash-3.2$ grep "#E200#" file1|cut -d# -f1|tr '\n' + 40+32+32+11+-bash-3.2$ -bash-3.2$ grep "#E200#" file1|cut -d# -f1|tr '\n' +|sed 's/+$//' は、何もでてきません、CTRL+cをして元にもどしてます。 ということなんです。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

tr '\n' + で、改行を+に置換することは出来ますが、最後にも+が付いてしまいます。それを取るとなると、 grep "#E200#" file1|cut -d# -f1|tr '\n' +|sed 's/+$//'|bc のようにだんだん長くなってしまいます。 awkを使うと、 awk -F# '/#E200#/{sum+=$1}END{print sum}' file1 と1つのコマンドで出来ます。 処理速度が問題にならない場合、単機能のコマンドをたくさん組み合わせて処理するのと、高機能のコマンド(Perlとか)で一発で処理するのとは好みの問題ですかね。 なお、bcのscale=2は、小数点以下2桁まで計算しろと言うことなので、整数だけの計算なら不要です。

glotte
質問者

補足

ここのところがうまく作用しません sed 's/+$//' なぜでしょう?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

いっそ面倒なので | (s=0; while read x; do s=`expr $s + $x`; done; echo $s) とか.

glotte
質問者

お礼

ありがとうございます、まだちょっとわたしには難しそうですが、これからがんばって勉強します。本当にありがとうございました。

  • ssk38
  • ベストアンサー率44% (22/49)
回答No.2

| while read i; do echo -n "$i+"; done とすればできます。

glotte
質問者

お礼

ありがとうございます、まだちょっとわたしには難しそうですが、これからがんばって勉強します。こういうのも覚えなきゃいけませんね。親身になって教えていただきありがとうございました。

  • mendokusa
  • ベストアンサー率13% (359/2726)
回答No.1

awkあたりがよさそうな気がします。

glotte
質問者

お礼

awkもこれから勉強します、親切なご回答ありがとうございました。