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

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

新規登録して質問してみよう
ただいま回答率
85.49%
POSIX

POSIXは、UNIX系OSでの共通機能などを維持するための標準を策定した規格。POSIX仕様によって開発したプログラムは、POSIXに準じたOSであればどれも同じように動作させることが可能です。

シェル

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

Q&A

解決済

4回答

1624閲覧

"aa bb cc 0.98" のようなスペース区切りの文字列を、最後のスペースだけタブに置き換えたい

miminashi

総合スコア22

POSIX

POSIXは、UNIX系OSでの共通機能などを維持するための標準を策定した規格。POSIX仕様によって開発したプログラムは、POSIXに準じたOSであればどれも同じように動作させることが可能です。

シェル

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

0グッド

0クリップ

投稿2018/06/04 18:37

一応こんな感じでできましたが、もっとよい方法があれば教えていただけるとありがたいです。
POSIXコマンドであればawk以外でもokです。

sh

1echo 'aa bb cc 0.98' | 2awk -v OFS='\t' '{ 3 l = length($0); 4 for(i=l; i>0; i--){ 5 if(substr($0, i, 1)==" ") { 6 break 7 } 8 }; 9 print substr($0,1,i-1), substr($0,i+1,l) 10}'

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

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

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

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

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

guest

回答4

0

こんにちは。

POSIXコマンドであればawk以外でもokです。

とのことですので、 sedを使ってみました。

[jun68ykt@imac ~]$ TAB=`printf '\t'`; echo 'aa bb cc 0.98' | sed -E "s/^(.+) ([^ ]+)$/\1${TAB}\2/" aa bb cc 0.98 [jun68ykt@imac ~]$

環境は Mac OS 10.13.4 High Sieraです。

投稿2018/06/04 20:54

編集2018/06/04 21:07
jun68ykt

総合スコア9058

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

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

miminashi

2018/06/04 21:21

こちらもなるほどです!ありがとうございます!
jun68ykt

2018/06/04 21:23

どういたしまして。解決されたようでよかったです!
guest

0

ベストアンサー

これでどうでしょう。

echo 'aa bb cc 0.98' | awk '{$(NF-1)=$(NF-1) "\t" $NF; $NF=""; print}'

修正: $NFが存在してはいるため末尾に入ってしまうスペースを除去。かなりやっつけ感が出てきてしまいましたが…。

echo 'aa bb cc 0.98' | awk '{$(NF-1)=$(NF-1) "\t" $NF; $NF=""; sub(" $","", $0); print}'

投稿2018/06/04 18:43

編集2018/06/04 19:18
KojiDoi

総合スコア13669

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

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

miminashi

2018/06/04 18:46

え、すごい、でもなんでこれで動くのかがわかりません・・・
KojiDoi

2018/06/04 18:54

スペースが文字列の連結なのはわかりますかね。
miminashi

2018/06/04 18:55

最後にスペースがはいってしまうようですが、除去する方法がわかりませんでした・・・
miminashi

2018/06/04 19:00

> スペースが文字列の連結なのはわかりますかね はい、これはわかります。 $NF で最後のフィールドを参照しているというのもわかりました。 $(NF-1)=$(NF-1) の部分がまだ理解できてません・・・
KojiDoi

2018/06/04 19:21

$(NF-1)=$(NF-1) そこで切ってはダメです。セミコロンまでが一つの式ですから。他の言語でならたとえばf[nf-1]=f[nf-1]+”\t"+f[nf]となるところです。
miminashi

2018/06/04 21:16

あー、なるほど、ふつうの代入式ですね。 ようやく理解できました、ありがとうございます。
guest

0

ネタ的な回答ということでひとつ…

echo 'aa bb cc 0.98' | \ sed 's/ /#/;s/ /#/' | \ tr ' ' '\t' | \ sed 's/#/ /g'

--- 追記 ---
最後の空白という条件が必須ならこんな感じでいけるかなあ
申し訳ありませんが動作確認はしてませんので…

x='aa bb cc 0.98' set -- $x n=`expr $# - 1` a=`echo $x | cut -f 1-$n` echo -e $a"\t"${$#}

投稿2018/06/05 00:47

編集2018/06/08 01:46
takasima20

総合スコア7458

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

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

miminashi

2018/06/07 10:11

これは自分でも思いついたのですが、生贄にする一時的な区切り文字のチョイスが難しいところですね。
otn

2018/06/07 11:14

$'\a'等のコントロール文字を使うとか。 しかしこれだと、「3つ目のスペースをタブに」であって、「最後のスペースをタブに」じゃないですね。
guest

0

変数に入っているとすると、

Bash

1A='aa bb cc 0.98' 2echo ${A% *}$'\t'${A##* }

標準入力なら、上記を使って

Bash

1echo 'aa bb cc 0.98' | 2while read A;do echo ${A% *}$'\t'${A##* };done 3```とするか、 4```Bash 5echo 'aa bb cc 0.98' | 6sed 's/(.*) (.*)/\1'$'\t''\2/'

投稿2018/06/04 21:25

otn

総合スコア84457

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

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

otn

2018/06/05 09:08 編集

rev を使えば、 echo 'aa bb cc 0.98' | rev | sed $'s/ /\t/' | rev でいいかと思ったけど、rev はPOSIXコマンドじゃないみたい。
miminashi

2018/06/07 10:18

3番目の例ですが、 \1 が貪欲にマッチするから、スペース1個はさんで \2 が 0.98 になるという理解であってるでしょうか。
otn

2018/06/07 11:11

はい。合ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問