このプレゼンテーションのテキストファイルで異なる名前の数を数えたい:
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番目の列のみにアクセスしようとしましたが、行数を出力できません。
ファイルは名前の列で事前に並べ替えられているように見えるため、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
awk
:
<fileName awk '!nameSeen[$3]++{ count++ } END{ print count }'
新しい名前が見つかった場合!nameSeen[$3]++
インクリメントカウンターcount++
およびEND
印刷カウンター値。
Millerを使用する本当に短くて簡単な方法( https://github.com/johnkerl/miller )
mlr --nidx uniq -g 3 -n input.txt
それ自体を説明するかなり単純な簡単な方法:
_cat FileName | sed 's/[0-9]*//g' | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l
_
_<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を削除します->|
_->sort -u
_で重複を削除します->|
_->wc -l
_で行を数えます->