あるファイル中の同じ文字列の行をカウントして
それぞれの文字列が何回現れるか集計するシェルを作ろうとしています。
しかし、最後のグループの集計がうまくいきません。
入力ファイルはソート済みです。
スコープの問題なのかどうか良くわかりませんが、想定外の動きをします。
このシェルの修正もしくは、別のいい集計方法、
どちらでも歓迎です。よろしくお願いします。
書いてみたシェル
------------------
#!/bin/sh
TARGET_STR=`head -n 1 uniqData.txt`
declare -i COUNT=0
cat uniqData.txt | while read LINE_STR
do
if [ "${TARGET_STR}" = "${LINE_STR}" ]; then
COUNT=$COUNT+1
else
echo $TARGET_STR:$COUNT
TARGET_STR=${LINE_STR}
COUNT=1
fi
done
echo $TARGET_STR:$COUNT
------------------
入力ファイル
------------------
asd
asd
asd
dfg
dfg
gghhjj
gghhjj
gghhjj
gghhjj
ttyyuuu
ttyyuuu
ttyyuuu
wwee
------------------
期待出力
------------------
asd:3
dfg:2
gghhjj:4
ttyyuuu:3
wwee:1
------------------
実際の出力
------------------
asd:3
dfg:2
gghhjj:4
ttyyuuu:3
asd:0
------------------
No.2ベストアンサー
- 回答日時:
回答としては#1の方法がベストだと思います。
参考までにシェルが希望通りに動作しないのは、
パイプ以降がサブシェルで動作するからです。
多分asdの行数が1行のときもうまくいかないのではないでしょうか?
解決方法としては以下のいずれかが考えられます。
1.変数をexportしてしまう。
2.シェルをbashに変更してwhileの部分も変更する。
while read LINE_STR
do
省略
done < uniqData.txt
3.シェルをkshとかに変更。
>パイプ以降がサブシェルで動作するからです。
おぉ。なるほど。非常に勉強になります。
方法としては#1の方が紹介してくださった方法で行いますが、
まだわかっていないことが多いので、こういう情報は非常に助かります。
ありがとうございます。
No.3
- 回答日時:
基本的にNo.1さんの回答で終わっちゃうんですが、少し補足。
データファイルがソートされていなくても
% sort uniqData.txt | uniq -c
でできますね。
出力形式が期待と違うでしょうけど、そこはawkなりperlなりで整形してください。
No.1
- 回答日時:
うわぁ。素人丸出しですね。ちょっと恥ずかしいです。
uniqは知っていたのですが、こんなオプションもあるんですね。
こちらの方法を利用して実装します。
大変助かりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pc98のコマンドプロンプトからD...
-
ubuntuの端末の左にカレントデ...
-
SUSEでのHave a lot of fun......
-
export と set は違うの?
-
CYGWINやKNOPPIXを、Bシェルか...
-
Kシェルに関して。
-
if [ "$PS1" ]の意味を教えてく...
-
SONYの音楽ソフト「x-アプリ」...
-
Dirコマンドでフォルダ内ファイ...
-
「Vmmem」のメモリ使用量が高い...
-
Openイベントを開始させないで...
-
windows10のごみ箱をrd /s /q C...
-
batである文字列内に特定の文字...
-
TOPコマンドで表示するCPU使用...
-
ddコマンドでイメージをコピー...
-
スクリプトのエラー「unexpecte...
-
-bash: ftp: コマンドが見つか...
-
コマンドプロンプト fcコマン...
-
「管理者権限で実行」を選ばな...
-
Dドライブでchkdskが走らなくな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ubuntuの端末の左にカレントデ...
-
export と set は違うの?
-
Cシェル内でBシェルの様な関数...
-
.cshrc ファイルについて
-
『存在するかどうか分からない...
-
シェル 会話形式でエンターキ...
-
lsコマンド部分一致方法
-
バックスラッシュの意味がわか...
-
コマンドプロンプトとかで、net...
-
posixでshellを起動したとき`da...
-
solarisのsetenvが無効
-
シェル(ksh)で変数にある文字列...
-
BシェルとCシェル
-
シェルスクリプトで #!/bin/sh ...
-
csh (tcsh)での環境変数の長さ...
-
pc98のコマンドプロンプトからD...
-
ターミナルが全く入力できない
-
Solaris9でdateコマンドの結果...
-
シェルスクリプトの中であるプ...
-
tcshなのにスクリプト構文中のs...
おすすめ情報