1

ファイル内の検索番号を使用してgrepで実行できることを知っている限り、Linuxシェルスクリプトは初めてです

egrep -o "[0-9][0-9]*" my_file

しかし、これらの文字列の最初の桁を取得して統計にするにはどうすればよいですか.. 1234、123、1267などなので、3回に1回取得します

私は知っている

A=$(tr -cd 1 < page.html|wc -c)

ファイル内の数字「1」のカウントを取得できますが、それは私が望むものではありません....最初の桁の「1」をカウントしたい....だから、私にとってはとても難しいです....

助けてください……どうもありがとう。

4

2 に答える 2

0

質問から、ファイルにはあらゆる種類の文字が含まれているように見え、ファイル内のすべての数字の最初の数字を分離したいと考えています。また、数字は行の最初の単語である必要はないようです (前にスペースがない場合など)。これら 2 つの前提を念頭に置いて、次のことを行うことができます。

grep '[0-9]' test.html| sed 's/\([0-9]\+\)/\n\1\n/g' |grep '^[0-9]' |cut -c1 |sort |uniq -c

例:

curl -N -s 'http://stackoverflow.com/users/1353267/samveen' |grep '[0-9]' |sed 's/\([0-9]\+\)/\n\1\n/g' |cut -c1 |grep '^[0-9]' |sort |uniq -c

重要: 上記の例のページには、{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":1353267,"accountId":1430801,"gravatar":"<div class=\"\">次のように分割される行があります。

{"fkey":"
8
f
1
a
9
c
6
e
21503516793
b
853265
ec
4939
","isRegistered":true,"userId":
1353267
,"accountId":
1430801
,"gravatar":"<div class=\"\">

この動作を望まない場合は、sedパターンが に変わります。これは、独立した数字 (単語の境界線) を
sed 's/\b\([0-9]\+\)\b/\n\1\n/g'検索するようになり、sed コマンドの出力が次のようになることを意味します。\b

{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":
1353267
,"accountId":
1430801
,"gravatar":"<div class=\"\">

また、sed変換を賢く選択すれば、カット コマンドは必要ありません。つまり
\([0-9]\+\)、パターンの一部が に変更された\([0-9]\)[0-9]*場合、sed は各数値の最初の桁のみを表示し、数値全体は表示しません。したがって、cut -c1もう必要ありません。を使用する
sed 's/\b\([0-9]\)[0-9]*\b/\n\1\n/g'と、次のようになります。

{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":
1
,"accountId":
1
,"gravatar":"<div class=\"\">

したがって、カットの必要はありません。

入力ファイルに関する詳細情報があれば、コマンドをさらに最適化できます。

于 2013-06-07T06:07:34.440 に答える