次の短いリストに似た長い項目のリストがファイルに書き込まれます。
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
で除算)になります。したがって、上記では以下を求めようとします。x
y
少なくとも18桁。
( . POSIX 文字クラスにmawk
置き換えられることはサポートされていませんが、他の実装とは異なり、ロケールに関係なく0123456789でのみ一致します。移植可能な場合、またはテキストに非ASCIIデータが含まれていないことがわかっている場合は使用できます。)[:digit:]
0-9
mawk
[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