
あるファイル中の同じ文字列の行をカウントして
それぞれの文字列が何回現れるか集計するシェルを作ろうとしています。
しかし、最後のグループの集計がうまくいきません。
入力ファイルはソート済みです。
スコープの問題なのかどうか良くわかりませんが、想定外の動きをします。
このシェルの修正もしくは、別のいい集計方法、
どちらでも歓迎です。よろしくお願いします。
書いてみたシェル
------------------
#!/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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ubuntuの端末の左にカレントデ...
-
ターミナルが全く入力できない
-
HPのマシンでTABキーと矢...
-
シェルスクリプトで #!/bin/sh ...
-
CYGWINやKNOPPIXを、Bシェルか...
-
シェル 会話形式でエンターキ...
-
FreeBSDのログインシェルshの$H...
-
find -exec内のshに変数を渡す方法
-
Cシェルでのファイルからの入...
-
Dirコマンドでフォルダ内ファイ...
-
batである文字列内に特定の文字...
-
設定をしてもファイルの関連付...
-
エクセルの表にヘンな枠が・・・
-
TOPコマンドで表示するCPU使用...
-
SONYの音楽ソフト「x-アプリ」...
-
pingは正常なのにtracerouteで...
-
TeraTermで操作する際の設定に...
-
Linux環境 grepで改行コード(CR...
-
ワイルドカードを使ってでフォ...
-
net use /d の強制実行
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シェル 会話形式でエンターキ...
-
ubuntuの端末の左にカレントデ...
-
export と set は違うの?
-
Cシェル内でBシェルの様な関数...
-
.cshrc ファイルについて
-
シェル(ksh)で変数にある文字列...
-
コマンドプロンプトとかで、net...
-
シェルを元に戻したい
-
solarisのsetenvが無効
-
lsコマンド部分一致方法
-
バックスラッシュの意味がわか...
-
WindowsXPについて
-
kshについて
-
シェルスクリプトの切り替え?
-
unix初心者です
-
apache停止してたら再起動させ...
-
UNIX(hp-ux)のコマンド履歴↑↓
-
シェルの編集の仕方について
-
telnetの制限
-
コンソールでの上下左右矢印ボ...
おすすめ情報