11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1
図のようなファイルがありますが、サイズが大きいです。私の目標は、111、1、11、1111などの数を出力することです。ファイルにすべて含まれています。私は次のことについて話している記事をたくさん見ています。
grep "\^word\" text_file
grep "\bword\b" text_file
grep -Fx "word" text_file
and so on...
どちらも何も出力しないか、ファイル全体を出力します。特定の番号だけをリストするにはどうすればよいですか?
答え1
tr
、sort
およびuniq
:を使用してください。
$ tr -s ' ' '\n' <file | sort | uniq -c
1
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
これは空行(上記の出力の最初の行)も提供しますが、以下を使用するとこれを防ぐことができますsed
。
$ tr -s ' ' '\n' <file | sed '/^$/d' | sort | uniq -c
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
パイプは、すべてのスペースを改行に変更し、結果行をソートし、各行の発生回数を計算します。
答え2
この問題では、grepを使用せずにawkを使用します。
$ a="11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1"
$ awk '{for (i=1;i<=NF;i++) ++seen[$i]}END{for (k in seen) print k,"found:"seen[k]}' <<<"$a"
1 found:17
11 found:5
111 found:1
11111 found:2
1111111 found:1
11111111 found:1
この1行のデモはファイル全体に適用されます(<<<"$a"
に置き換えますyourfile
)。