次のテキストを含むファイルがあるとします。
- 番号1
- 番号_3
- 番号1
- 番号_4
正規表現を使用して各状況に対して一度だけ印刷する方法番号_n?使用:
grep -oE "Number_\w+"
すべての一致を返します。
番号1
番号_3
番号1
番号_4
しかし、私は次のような結果が欲しいです。
番号1
番号_3
番号_4
答え1
grep -oE "Number_\w+" | sort -u
答え2
(あ、ところで編集者が質問を少し変えましたね。)
各出力行のコピーを1つだけ印刷する簡単な方法は、パイプsort -u
(またはsort | uniq
)を使用することです。もちろん、これは出力をソートします。
その他の関連ソリューションは次のとおりです。ユニークなライン印刷
(もともとこの質問に対する答えは次のとおりです。)
正規表現に一致する最初の文字列のみを印刷するには、次のものを使用できます
grep -m1 ...
。
-m NUM, --max-count=NUM
Stop reading a file after NUM matching lines.
一致するものが別の行にある場合は直接機能しますが、同じ行に一致する文字列が複数ある場合はすべて-o
印刷されます| head -1
。
答え3
$ awk '{print $NF}' file | sort -u
Number_1
Number_3
Number_4
$ awk '{Arr[$NF]++}END{for(i in Arr)print i}' file
Number_3
Number_4
Number_1
答え4
使用jq
:
$ cat file
Number_1
Number_3
Number_1
Number_4
$ jq -n -R -r '[inputs | select(test("^Number_\\d+$"))] | unique[]' file
Number_1
Number_3
Number_4
または、コマンドラインで提供されている正規表現を使用してください。
$ jq -r -R -n --arg re '^Number_\d+$' '[inputs | select(test($re))] | unique[]' file
Number_1
Number_3
Number_4
これはPCRE正規表現に一致する行を選択します^Number_\d+$
。次に、一致する各行の最初の一意のインスタンスのみを維持しながら、すべての重複一致を削除します。