문자열의 자릿수를 기준으로 목록 필터링

문자열의 자릿수를 기준으로 목록 필터링

다음 짧은 목록과 유사한 긴 항목 목록이 파일에 기록되어 있습니다.

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

관련 정보