다음 짧은 목록과 유사한 긴 항목 목록이 파일에 기록되어 있습니다.
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