web-dev-qa-db-ja.com

ファイル内の異なる名前の数を数える

このプレゼンテーションのテキストファイルで異なる名前の数を数えたい:

2008 girl Avah
2009 girl Avah
2008 girl Carleigh
2011 girl Kenley
2012 boy Joseph
2013 boy Joseph
2014 boy Isaac
2014 boy Brandon

したがって、基本的には重複をスキップして答えを出したいと思います。6。awkを使用して3番目の列のみにアクセスしようとしましたが、行数を出力できません。

6
Rebi Khalifa

ファイルは名前の列で事前に並べ替えられているように見えるため、uniq-f--skip-fields)各名前の最初の行のみを出力し、行を数えるオプション:

uniq -f2 FileName | wc -l

または

uniq --skip-fields=2 FileName | wc -l

データがnotで事前にソートされている場合は、sort -u とともに -k同じことを達成するためのフィールド指定(ただし、GNU sortのマニュアルページに明確に記載されていません):

sort -uk3 FileName | wc -l

これはやり過ぎですが、GNU Datamashを使用することもできます。

datamash -W countunique 3 < FileName
6
steeldriver

awk

<fileName awk '!nameSeen[$3]++{ count++ } END{ print count }'

新しい名前が見つかった場合!nameSeen[$3]++インクリメントカウンターcount++およびEND印刷カウンター値。

6
αғsнιη

Millerを使用する本当に短くて簡単な方法( https://github.com/johnkerl/miller

mlr --nidx uniq -g 3 -n input.txt
2
aborruso

それ自体を説明するかなり単純な簡単な方法:

_cat FileName | sed 's/[0-9]*//g' | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l
_

Or@αғsнιη'sの懸念を満たす oC

_<FileName sed 's/[0-9]*//g' | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l
_

Or別の oC 準拠コマンド:

_sed 's/[0-9]*//g' <FileName | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l
_

@ Rebi Khalifaへの通知

@αғsнιηrightlyコメントに書きました未満:

または_<fileName cut -d' ' -f3 |sort -u |wc -l_; _cat filename | ..._は oC です

@ steeldriverrightlyコメントに書きました未満:

これらすべてのcutコマンドではなくsedを使用することをお勧めします-少なくともそれらを組み合わせて、1つの呼び出しexにする必要があります。 sed -E -e 's/^[0-9]+//' -e 's/\b(boy|girl)\b//'

彼らは両方ともあなたが試みていた同じアプローチであるフィールド選択アプローチを使用しました問題を解決するために実装する質問に書き込んだ内容に基づいて

Awkを使用して3番目の列のみにアクセスしようとしましたが、行数を出力できません。


Ubuntuで物事を成し遂げるために洗練されたである必要はありません!物事は想像を絶する多くの方法で行うことができます。

KISSの原則 を称賛する1つの方法は、ミッションが完了するまで_|_の単純なコマンドを次から次へとパイプすることです。

  • _cat FileName_でファイルの内容を読み取ります->
  • パイピング_|_->
  • _sed 's/[0-9]*//g'_->でnumber groupsを削除します->
  • パイピング_|_->
  • _sed 's/\<boy\>//g'_で単語boyを削除します->
  • パイピング_|_->
  • _sed 's/\<girl\>//g'_で単語girlを削除します->
  • namesのみが残りました...->
  • それをパイプ_|_->
  • 名前を並べ替え、_sort -u_で重複を削除します->
  • 一意の名前のみが残りました->
  • パイピング_|_->
  • _wc -l_で行を数えます->
  • 完了
2
Raffa