誰か教えてください。
シェル初心者です。

ファイルにある特定の文字の数を数えたいのです。
ファイルの内容
tttattttatttttatttttatttt
tttttattttatttattttattttt
tttattatttttttattttattatt
tttattttttatttttatttttttt

行ごとに
aの数
4、4、5、3
をの値を取りたいです。
お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

私なら、こういうのはシェルでなく Perl でやりますが…


取りあえず、こんなところでどうでしょうか?
――――――――――――――――――――
cat filename | while read X
do
  A=`echo $X | sed 's/[^a]//g' | wc -c`
  echo `expr $A - 1`
done
――――――――――――――――――――

filename の内容がご質問のデータだとすると、これを実行すれば
4
4
5
3
と表示されます。

A の値から1を引いているのは、改行コードの分を除くためです。

それぞれのコマンドの意味は、man コマンドで調べて下さい。
それでもわからないところがあれば、補足をお願いします。

この回答への補足

補足ではないです。
お礼です。

wcコマンドを知りませんでした。
とても助かりました。
解決しました。

補足日時:2002/03/01 17:24
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
Perlではなくbchを勉強しようと作っているもので。。。
ごめんなさい調べるより質問した方が早いかなとおもって。。。
試してみます。
ありがとうございました。助かりました。
うまくいってから締め切りたいと思います。

お礼日時:2002/02/28 16:21

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

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

Q秀丸で指定のフォルダのファイル数を数え、最後のファイルのファイル名を取

秀丸で指定のフォルダのファイル数を数え、最後のファイルのファイル名を取得するというマクロを作成したいのですが、以下の点がわからず、困っております。

どうやら標準の関数ではファイル数を数える関数はないようなので、
COMの呼び出しを使おうと思うのですが、FSOを使った記述の仕方がヘルプを読んでみてもよくわかりませんでした。

普段はUWSCを使っており、いわゆるUWSCのGETDIR_FILES[ ]関数に相当することがしたいです。

UWSCだと

folder = "ここにフォルダ名"
count = GETDIR(folder)

msgbox(GETDIR_FILES[count-1])

これだけなのですが、秀丸だと・・・という感じです。

お手数をおかけしますが、お分かりになられる方がいらっしゃいましたら、
御教授いただけないでしょうか?
よろしくお願いいたします。

Aベストアンサー

if(existfile(windir + "\\command.com") == true) {
  $$doswin = "command.com";
} else {
  $$doswin = "cmd.exe";
}
##temp = hidemaruhandle(0);
newfile;
insert "DEL FILELIST.TXT\r";
insert "DIR /B *.TXT > FILELIST.___\r";
insert "SORT FILELIST.___ > FILELIST.TXT\r";
insert "DEL FILELIST.___\r";
insert "DEL LISTMAKE.BAT\r";
insert "EXIT\r";
saveas "LISTMAKE.BAT";
##bat = hidemaruhandle(0);
setactivehidemaru ##temp;
closehidemaruforced ##bat;
runsync2 $$doswin + " /C LISTMAKE.BAT";
openfile "/(0,512,512,256) FILELIST.TXT";
closehidemaruforced ##temp;

これでカレントディレクトリにある、拡張子txtのファイルの一覧がソートされた結果がファイルに記録され、
そりファイルを開いた状態の秀丸が新たに起動します。
gofileendでファイルの最後までカーソルを移動させれば、カレントディレクトリにある.txtのファイル数も判るでしょう。
# 作業ファイルのFILELIST.TXTが残りますが…

if(existfile(windir + "\\command.com") == true) {
  $$doswin = "command.com";
} else {
  $$doswin = "cmd.exe";
}
##temp = hidemaruhandle(0);
newfile;
insert "DEL FILELIST.TXT\r";
insert "DIR /B *.TXT > FILELIST.___\r";
insert "SORT FILELIST.___ > FILELIST.TXT\r";
insert "DEL FILELIST.___\r";
insert "DEL LISTMAKE.BAT\r";
insert "EXIT\r";
saveas "LISTMAKE.BAT";
##bat = hidemaruhandle(0);
setactivehidemaru ##temp;
closehidemaruforced ##bat;
runsync2 $$doswin + " /C LISTMA...続きを読む

Qunixのシェルでファイル内容を読み込む

ど初心者です。わかりづらいかもしれませんが宜しくお願いします。
以下のような処理を行いたいと考えています。
(1) aaa.sh(シェルスクリプト)にてバッチプログラムを起動
(2)バッチでエラーの場合、結果ファイル(bbb.txt)に「1」を出力する。
(3)aaa.sh(シェルスクリプト)にて結果ファイルの内容を読み取り「1」の場合は、再度バッチプログラムを起動する。

このうち(3)の処理にて、結果ファイルの読み込み方法がわかりません。
調べた結果、以下のような処理で可能なようですが・・

while read LINE; do
echo $line
done < aaa.txt

読み込むのは1行なので、ループ処理にはしたくないのですが、例えば「read LINE aaa.txt」のような簡単なコマンドで、ファイルの中身を読み込むことはできないのでしょうか?

実はUNIXが初めてで、しかもスケジュールに余裕がないため焦っております。
なにぶん知識不足な故、ちんぷんかんぷんな質問かも知れませんが、よろしくお願いいたします。

ど初心者です。わかりづらいかもしれませんが宜しくお願いします。
以下のような処理を行いたいと考えています。
(1) aaa.sh(シェルスクリプト)にてバッチプログラムを起動
(2)バッチでエラーの場合、結果ファイル(bbb.txt)に「1」を出力する。
(3)aaa.sh(シェルスクリプト)にて結果ファイルの内容を読み取り「1」の場合は、再度バッチプログラムを起動する。

このうち(3)の処理にて、結果ファイルの読み込み方法がわかりません。
調べた結果、以下のような処理で可能なようですが・・

while rea...続きを読む

Aベストアンサー

aaa.txtの先頭1行を読むなら、
read line < aaa.txt

なお、シェルではなく、「シェルスクリプト」です。

Qファイル数を見て削除するシェルプログラム

mysql のデータベースを mysqldump で取得して
そいつを日付のファイル名をつけてバックアップを取っているのですが
このままだとひたすら数が増え続けてしまいます。

ファイル数を決めておいて、ある一定数になれば古いものから削除していくような
プログラムを書きたいのですが…

ちなみにファイルは一つのディレクトリにあり
db-20050101.tar.gz のようなフォーマットです。

よろしくお願いします。

Aベストアンサー

以下のようなスクリプトを実行してください。
-------------------------
#!/usr/bin/sh
#
loopcnt=0
zanfile=10
filelist=`ls -r db-????????.tar.gz` # 削除対象ファイルの一覧取得
for delfname in $filelist; do
if [ $loopcnt -ge $zanfile -a -f $delfname ]; then
rm -f $delfname || exit 10 # ファイル削除
#echo "$delfname was deleted!"
fi
loopcnt=`expr $loopcnt + 1`
done
#
# 正常終了
#
exit 0
-------------------------
shのパスはあなたのマシンの環境にあわせてください。
zanfile=10が残すファイルの数です。適切な数値をセットして下さい。
必ず削除対象ファイルが存在するディレクトリで実行して下さい。
実行してないので自信なし。

以下のようなスクリプトを実行してください。
-------------------------
#!/usr/bin/sh
#
loopcnt=0
zanfile=10
filelist=`ls -r db-????????.tar.gz` # 削除対象ファイルの一覧取得
for delfname in $filelist; do
if [ $loopcnt -ge $zanfile -a -f $delfname ]; then
rm -f $delfname || exit 10 # ファイル削除
#echo "$delfname was deleted!"
fi
loopcnt=`expr $loopcnt + 1`
done
#
# 正常終了
#
exit ...続きを読む

Q【コマンドライン】【ファイル数を数えて指定形式で記述】

【コマンドライン】【ファイル数を数えて指定形式で記述】

いつも参考にさせていただいております。

-質問内容-
コマンドラインで連番で自動作成されたファイルを指定文字列形式で出力したい
(コマンドラインに組み込みたい)

-詳細-
連番で出力された画像ファイルをHTMLにて
<IMG SRC='画像のURL'>
などとして使用したい

出力されるファイルの数は毎回変わるので目視で数える必要があるため今回の質問をさせていただいております。

Aベストアンサー

そういうことであれば、全く方針を変えて、1からの連番であると言うことを前提にしてこんな感じで。

@echo off
cd 任意の文字列\img
echo 上部情報1行目
。。。
echo 上部情報最終行
set N=0
:LOOP
set /a N+=1
if not exist file%N%.jpg goto END
echo ^<IMG SRC='http://◆/img/file%N%.jpg'^>
set /a X=N %% 5
if %X% NEQ 0 goto LOOP
echo 中間情報1行目
。。。
echo 中間情報最終行
goto LOOP

:END
echo 下部情報1行目
。。。
echo 下部情報最終行

Qシェルスクリプトでファイル名の特定部分を一括で変更したい

シェルスクリプト初心者です
よろしくお願いします。

変更前
video(1).mp4
video(2).mp4
video(3).mp4
.
.
video(10).mp4
video(11).mp4

変更後
1.mp4
2.mp4
3.mp4
.
.
10.mp4
11.mp4

forでファイル作成をしたりrenameコマンドで拡張子の変更などはできるんですが、
ファイル名の特定部分を変更することができません。
sedコマンドも調べていたんですがイマイチ理解できず。
配列にファイル名を入れて一つずつ正規表現で変更していくと思うんですが。。。

ちなみにrubyでは上記の変更はできました。

ご意見をいただければ幸いです。

Aベストアンサー

スクリプトの種類が提示されていないのでbash前提で書きました。
-------------------------
#! /bin/bash
files="*(*).mp4"
fnames=()
for fname in $files; do
fnames+=("$fname")
done

for fname in ${fnames[@]}; do
echo $fname
tofname=${fname#*(}
tofname=${tofname/)/}
echo $tofname
mv $fname $tofname
done
--------------------------------
カレントディレクトリ下の
*(*).mp4にマッチするするファイルを全て取得して
ファイル名を変更しています。
途中経過が判るようにechoを行っています。不要であれば削除してください。
ファイル名を変更するのでファイルのバックアップを取ってから実行してください。
下記URLが参考になるかと。
http://wordpress.honobono-life.info/code/bash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%86%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%B8%80%E8%A6%A7%E3%81%A8/

http://d.hatena.ne.jp/ozuma/20130928/1380380390

スクリプトの種類が提示されていないのでbash前提で書きました。
-------------------------
#! /bin/bash
files="*(*).mp4"
fnames=()
for fname in $files; do
fnames+=("$fname")
done

for fname in ${fnames[@]}; do
echo $fname
tofname=${fname#*(}
tofname=${tofname/)/}
echo $tofname
mv $fname $tofname
done
--------------------------------
カレントディレクトリ下の
*(*).mp4にマッチするするファイルを全て取得して
ファイル名を変更しています。
途中経過が判るようにech...続きを読む


人気Q&Aランキング

おすすめ情報