文字列の桁数に基づいたリストのフィルタリング

文字列の桁数に基づいたリストのフィルタリング

次の短いリストに似た長い項目のリストがファイルに書き込まれます。

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
6846DFEC-C0A2-11E8-B7A8-3ECB9C0CC049
--[SNIP]--

各項目の桁数(セットの文字)に基づいてこのリストをフィルタリングし、桁数が特定のしきい値を超える場合は0123456789文字列を保持し、それ以外の場合は削除したいと思います。前の例では、名前に18桁の数字を含むすべての項目を保持するにはどうすればよいですか?

予想出力:

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049

答え1

そしてawk

awk -F '[[:digit:]]' 'NF > 18'

数字をフィールド区切り文字として使用するため、フィールド数は1に数字を加えた値(合計x1yで除算)になります。したがって、上記では以下を求めようとします。xy少なくとも18桁。

( . POSIX 文字クラスにmawk置き換えられることはサポートされていませんが、他の実装とは異なり、ロケールに関係なく0123456789でのみ一致します。移植可能な場合、またはテキストに非ASCIIデータが含まれていないことがわかっている場合は使用できます。)[:digit:]0-9mawk[0-9]awk[0123456789][0-9]

お持ちの方のために 正確に18桁の数字、つまり:

awk -F '[[:digit:]]' 'NF == 19'

の場合、sed少なくとも18桁:

sed -e 's/[[:digit:]]/&/18;t' -e d

そしてgrep

grep -E '(.*[[:digit:]]){18}'

答え2

データがというファイルに保存されていると仮定すると、file.txt次のことができます。

#!/bin/bash
cat file.txt | while IFS= read line; do

n=$(echo $line | awk '{print gsub("[0-9]", "")}')
if [[ $n -gt 17 ]]; then 

echo $line
fi
done

FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049

または

awk 'gsub("[0-9]", "&") >= 18'

答え3

18桁の数字()を含む行を見つけるには、[0-9]を使用できますgrep

egrep '([0-9][^0-9]*){18}'

または

grep -E '([0-9][^0-9]*){18}'

説明する

egrepと同じですgrep -E

grep      # Command to filter text using regular expressions
-E        # Use extended regex

(
  [0-9]   # Exactly one digit
  [^0-9]* # 0 or more characters except digits
)           
{18}      # Find 18 times

答え4

Perlの戻り値を使用するのはどうですかtr(awkの戻り値を使用するのと似ていますgsub

$ perl -ne 'print if tr{0-9}{0-9} >= 18' file
FFF1B976-9DDE-11E7-9C3D-6241D7D553BE
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049
682D9DB6-C0A2-11E8-B7A8-3ECB9C0CC049

関連情報