文字列の特定部分の固有数を取得する方法

文字列の特定部分の固有数を取得する方法

ファイルにデータ・セットがあります。

psf7433-nlhrms
unit7433-nobody
unit7333-opera
bpx7333-operations
app7333-osm
unit7330-partners
psf7331-pdesmond
unit7333-projm
mnp7330-redirect
unit7333-retailbanking
cpq7333-rkarmer
unit6333-sales
ring7323-support
unit7133-telco
post7323-uadb
sun7335-ukhrms
burp7133-wfnmreply

各行の数字の後に始まるアルファベット文字と文字を無視して一意の数字を取得するにはどうすればよいですか? (または)各行の数値のみを検索し、一意の数を取得する方法。

数値だけを抽出したことを考慮すると、次のようになります。

7433
7433
7333
7333
7333
7330
7331
7333
7330
7333
7333
6333
7323
7133
7323
7335
7133

では、数値の一意の数を検索したいと思います。したがって、重複を無視して次の最終出力を取得する必要があります。

8

私はこれを使ってこれをすることはできませんアッまたはsedでも単純ですクエリ切り取り

値のリストを抽出する必要はなく、最終的な数を答えとして欲しいです。

助けてください!

答え1

grep数字のみをフィルタリングするには、を使用します。

grep -Eo '[0-9]+-' file | sort -u | wc -l
  • [0-9]0から9(すべての数字)の間のすべての文字と一致します。
  • +存在する拡張正規表現少なくとも1つの文字を表します。これが-Eこのオプションが一緒に使用される理由ですgrep。したがって、[0-9]+-1つ以上の数字と一致し、その後に-
  • -oパターンと一致する部分だけが印刷されるため、入力が与えられるとそのabcd23-gf56部分grepのみが印刷されます23-
  • sort -u(によって-u)一意の項目を並べ替えてフィルタリングし、入力のwc -l行数(つまり一意の項目数)を計算します。

答え2

あなたはそれを使用することができます:

tr -dc '\-0-9\n' | sort -u -t- -nk1,1 | grep -c .

...もちろん、これはMuluの答えからインスピレーションを得たものではありません。ただし、違いは、入力に空白行があるときではgrepなく、行を数えるのに慣れていることです。一致する行だけが印刷されるので、wc彼の答えには空行問題はありません。grep -ogrep -cここでのみ計算してください)、しかしtr する改行文字は削除されない数少ない文字の1つなので、空白行を印刷します。つまり、入力に空白行がある場合、wc結果は1ずつ歪みます。

したがって、trここでの効率は計算部門よりも高いかもしれませんが、計算部門を上回ることgrep -oもできます。私はこのアプローチが大好きです。これは移植性のためでもありますが、通常は最も効率的なフィルタを最初に使用してデータを整理してから、後でチェーンで効率が悪いフィルタを使用しようとするためです。wcgrep

sortこれにより、ab区切り文字に分割された数字の順序に基づいて、一意の順序で考慮される行ごとの桁数を選択できます。入力から数字、ダッシュ、または改行バイトの補数を削除します。この方法 - ダッシュが表示されない限り-u-n-k-t-tr -d-c-今後比較したい数値文字列の場合、行に残っている唯一のものは次のとおりです。

#nothing at all

...または...

[numbers]

...または...

[numbers]-[more numbers]more-dashes-...

したがって、出力がパイプされたときにダッシュsort(存在する場合)の前に表示される数値文字列のみを比較するように指示します。これで重要な唯一の数字は、計算したい数字(ダッシュかどうか)です。

次に、少なくとも1つの文字を含む行の数をgrep -c数えます。.次のコマンドは以下を印刷します8

tr -dc '\-0-9\n' <<\IN | sort -u -t- -nk1,1 | grep -c .
psf7433-nlhrms
unit7433-nobody
unit7333-opera
bpx7333-operations
app7333-osm
unit7330-partners
psf7331-pdesmond
unit7333-pro-09-0jm
mnp7330-redir09o-0ect
unit7333-retailbanking
cpq7333-rkarmer
unit6333-sales
ring7323-support


unit7133-telco
post7323-uadb
sun7335-ukhrms
burp7133-wfnmreply
IN

答え3

拡張 grep を使用して 4 桁の数字を検索し、grep に一致する項目のみをリストするように指示します (デフォルトの行全体ではなく)。

grep -Eo '[0-9]+' <filename>

この数字のリストを並べ替え、一意の数字のみを出力します。

sort -u

行数を計算します。

wc -l

一緒に入れてください:

$ grep -Eo '[0-9]+' filename | sort -u | wc -l
8

答え4

awk解決策

awk -F'-' '{sub(/[^[:digit:]]+/, "", $1); a[$1]} END{for (k in a) ++i; print i}' file
8

関連情報