awkで、文字列の最後に特定の文字があったときにそれを削除するというものを作ろうと思います。
最後の文字が何であるかを調べるには、lengthで文字列の長さを調べてから、substrを使えば調べられると思うのですが、その文字を削除する方法がわかりません。文字列のx文字目までを取得する、あるいは、x文字目の文字を置換する(この場合ヌルに)という操作ができれば良いと思うのですが、それらしい文字列関数が無いように思います。どのような操作をするべきなのでしょうか?
環境は、Windows98でgawk32を使っています。

A 回答 (2件)

文字列の最後だけをターゲットにするのであれば、長さなんて知らなくても


正規表現でOKです。

例えば、文字列 s の末尾が英小文字だったら削除する、だったら

if ( s ~ /[a-z]$/ ) {
 sub( /.$/, "", s );
}

という感じ。

ちょっと正規表現が見にくいでしょうか?
sub() の行だけを全角文字で書くと

sub( /.$/, ””, s );

です。
    • good
    • 0
この回答へのお礼

なるほど。正規表現ってはこうやって使うんですね。今まで、検索の時に便利になる程度のものと思っていましたが、なかなか強力な使い方できることがわかりました。ありがとうございます。

お礼日時:2001/08/07 20:23

もっと良い方法があるかもしれませんが(awk最近あまり使ってないので...)


substrを使うのはどうでしょうか?
BEGIN {
str = "abcdef"

print "before:" str
str = substr( str, 0, length( str ) - 1 )
print "after :" str
}
    • good
    • 0
この回答へのお礼

なるほど、substrでもこうやれば可能ですね。substr自体は知っていたのですが、この使い方に思い至りませんでした。有り難うございます。

お礼日時:2001/08/07 20:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qawk と gawk の書き方の違い

PCでAWKコマンドを使いたくてgawkを使ってみたのですが、
やっぱりawkのような書き方では上手く実行できないみたいです。
gawkのバージョンは v3.1.6です。

コマンド (awk) awk -F, '{printf("copy aaa\%s bbb\%sn",$0,$0)}' list.txt

単純にDOSのバッチをファイルから作りたいだけなのですが・・・gawkではどのように書けば良いのか教えてください。お願いします。

仕事でUNIXを使っていたのですがPCに移行するという話がでていて、今までのunixコマンドをPCで動くようにソースを書き直して行かなくてはならないのにパスを『/』から『\』にしただけでは全く動きませんでした。やっぱりUNIXのawkでは出来てPCのgawkでは出来ないこともあるのでしょうか?それとも書き方の問題でしょうか??

Aベストアンサー

>やっぱりawkのような書き方では上手く実行できないみたいです。
エラー箇所と内容を返してくると思いますが具体的にどういう状況でしょうか。

単純に引用符の問題だけのように思えますが↓でどうでしょう。
※一部単純な誤記と思われる部分(\→\\、n→\n)も変更しました。

gawk -F, "{printf(\"copy aaa\\%s bbb\\%s\n\",$0,$0)}" list.txt

Qawkで最後の列だけ除外する方法

「awkのみ」で最後の列だけを区切り文字も含めて除外するのに、スマートな方法は無いでしょうか?
x1,x2,x3,…,x98,x99,x100

x1,x2,x3,…,x98,x99
とする方法です。
$ awk {$100="";print $0}
だと最後のカンマが残りますし、かといってprint $1, $2,…$98, $99
はダサいのでやめたいのですが・・・

Aベストアンサー

BEGIN{FS=OFS=","}
{NF--;print}

かな。

Qawkで可変文字列をマッチング

シェルなどでawkを使う際に、シェルの引数として渡された文字列をawkに渡し、それを条件にマッチングをかけたいのですが、どうしたら良いのでしょうか?(まあ、素直にgrepを使えばいいのですが・・・)

例えば、

cat foo.txt | awk '{if ($2 == ptn) print}' ptn=$<シェルの引数>

とかやれば、2番目のフィールドに完全に一致する行が抽出できるのですが、

cat foo.txt | awk '/ptn/ {print}' ptn=$<シェルの引数>

とかやっても、"ptn"という文字列をマッチングしてしまうので、うまくいきません。どの位置に出現するかわからないけど、シェルの引数で指定された文字列が含まれている行だけを出力したい場合、どうしたらよいのでしょう・・・。

Aベストアンサー

shですか?

シングルクオート ' は中の引数を展開しません。
シェル変数は渡すときに中身で展開してほしいわけですから、ダブルクオート " を使います。
こんな感じ、、

cat foo.txt | awk '/'"$1"'/{print}'
ここで、$1 は sh でのシェルスクリプトに渡される一番目の引数です。

では。

Qawkを使って文字列処理の問題

awkで以下のことをやりたいですが、
a.txtの中身は
aaaa
bbbb
cccc
の三つのレコードがあります。
b.txtの中身は
東京a
埼玉b
千葉c
東京d
になってます。
ファイルa.txtのみっつのレコードのを読み込んできて、b.txtに対して検索して、東京
という文字列があれば、そのレコードは、aaaaに置き換えて、あるファイルに出力する
ようなスクリプトを書きたいです。
どう書けば、いいですか?教えていただけませんか?

Aベストアンサー

b.txtの「東京」を「aaaa」に変えるなら、
awk '{gsub("東京","aaaa");print}' b.txt
ですが、それとa.txtはどういう関係があるのですか?

Q文字列の一部を取り除きたい(awk?)

こんにちわ。

下記の文字列操作を行いたいのですが上手くいきません。
どなたか教えて下さい。
環境OSはsolarisです。
awkにはこだわりません。

・最初の2文字を取り除く
・最後の文字が"2"の場合取り除く


yoroshikune → roshikune
onegai2 → egai

Aベストアンサー

どうせなら、両方ともsedで、

sed -e 's/^..//' -e 's/2$//'

awkだと、
awk '{X=substr($0,3);sub(/2$/,"",X);print X}'


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報