2개의 특정 숫자 뒤에 6자리가 포함된 행 찾기

2개의 특정 숫자 뒤에 6자리가 포함된 행 찾기

다음 줄을 표시하려면 정규식을 만들어야 합니다.포함하다94, 95, 96, 97, 99.

grep -P '(94|95|96|97|99)'

이 2자리 숫자 뒤에는 6자리 이상이 올 가능성이 가장 높지만, 사이에 공백이 있을 수 있으므로 제거해야 합니다.

sed 's/\(.\) /\1/g'

그런 다음 357, 00357 또는 +357에 대한 언급을 모두 삭제해야 합니다.

sed 's/\(357\|00357\|+357\)//g'

마지막으로 해야 할 일은 한 줄에 6자리만 있는지 확인하는 것입니다.뒤쪽에위에서 언급한 원본 2입니다. 그래서 각 행은포함하다94, 95, 96, 97, 99로 시작하는 총 8자리 숫자입니다. 숫자가 8개보다 많거나 적으면 해당 행은 나에게 쓸모가 없습니다.

각 줄에 94, 95, 96, 97 또는 99로 시작하는 숫자가 포함되어 있고 그 뒤에 6자리 숫자만 있는지 확인하고 해당 줄만 표시하려면 어떻게 해야 합니까?

입력은 다음과 같습니다.

2020-11-03  13:00   2020-11-03  14:00   99 123456
2020-11-03  13:00   2020-11-03  14:00   9412 3456
2020-11-03  13:00   2020-11-03  14:00   95123456
2020-11-03  13:00   2020-11-03  14:00   456345 3453543654567
2020-11-03  13:00   2020-11-03  14:00   +357678423683
2020-11-03  13:00   2020-11-03  14:00   00357584903
2020-11-03  13:00   2020-11-03  14:00   +35 799 1276 45
2020-11-03  13:30   2020-11-03  14:30   97123456

예상 출력은 다음과 같습니다

2020-11-03  13:00   2020-11-03  14:00   99123456
2020-11-03  13:00   2020-11-03  14:00   94123456
2020-11-03  13:00   2020-11-03  14:00   95123456
2020-11-03  13:00   2020-11-03  14:00   99127645
2020-11-03  13:30   2020-11-03  14:30   97123456

답변1

를 사용하면 perl다음을 수행할 수 있습니다.

perl -lne 'if (/\t\K(?:(?:\+|00)? ?3 ?5 ?7 ?)?(9[4-9]( ?\d){6})\s*$/) {
           s{}{$1 =~ s/ //gr}e; print}' < file

sed다음과 동일합니다(확장 정규식 지원을 사용하여 구현한다고 가정) -E.

eval "$(printf 'NL="\n" TAB="\t"')"
LC_ALL=C sed -E "
  /$TAB((00|\+)?3 ?5 ?7 ?)?(9[4-9]( ?[0-9]){6})[[:space:]]*\$/!d
  s//$TAB\\$NL\3/;  # separate prefix and 8 digits
  h;                # save a copy
  s/.*\n//;         # extract 8 digits
  s/ //g;           # remove spaces among digits
  G;                # append saved copy and keep prefix and trimmed digits:
  s/(.*)\n(.*)\n.*/\2\1/" < file

여기서는 입력 예와 같이 필드가 TAB으로 구분되어 있다고 가정하고 에서와 같이 거짓 긍정을 피하기 위해 TAB을 따를 때만 숫자를 찾습니다 +1 996 123456.

답변2

awk를 사용하세요

awk '{
    match($0,/^([^[:space:]]+[[:space:]]+){4}/)
    last_part = substr($0,RLENGTH+1)

    gsub(/[[:space:]]/,"",last_part)
    gsub(/^(+|00)357/,"",last_part)

    if (last_part ~ /^9[45679]/ && length(last_part) == 8) {
        printf "%s%s\n", substr($0,1,RLENGTH), last_part
    }
}' file

산출:

2020-11-03  13:00   2020-11-03  14:00   99123456
2020-11-03  13:00   2020-11-03  14:00   94123456
2020-11-03  13:00   2020-11-03  14:00   95123456
2020-11-03  13:00   2020-11-03  14:00   99127645
2020-11-03  13:30   2020-11-03  14:30   97123456

설명하다:

  • match()처음 4개 필드를 공백과 일치시킨 후 내장 변수는 RLENGTH첫 번째 부분의 끝을 유지합니다. 필드로 분할할 수도 있지만 이 경우 초기 정렬을 유지하고 시작되는 숫자 범위의 인덱스(현재는 )와 쉽게 일치시키기 위해 분할하는 것을 좋아하지 않습니다 RLENGTH+1.

  • gsub()숫자 영역의 모든 공백을 제거 하여 시작하십시오 . 편의를 위해 이 작업을 두 단계로 수행합니다(다른 것에 대해 걱정하지 않기 위해 +35 7).

  • 두 번째 단계에서는 gsub()접두사( +357, 00357또는 357)를 찾아서 삭제합니다.

  • 마지막으로 숫자 범위가 원하는 접두사로 시작하는 경우그리고길이는 8자( printf개행 문자)입니다.

인용하다:GNU awk 문자열 함수

답변3

나는 다음과 일치할 것이다:

  Space
  9
  5 through 9
  0 or 1 Space
  6 digits
  a non-digit


grep -E ' 9[5-9] ?[0-9]{6}[^0-9]' file

관련 정보