파일에 데이터 세트가 있습니다.
psf7433-nlhrms
unit7433-nobody
unit7333-opera
bpx7333-operations
app7333-osm
unit7330-partners
psf7331-pdesmond
unit7333-projm
mnp7330-redirect
unit7333-retailbanking
cpq7333-rkarmer
unit6333-sales
ring7323-support
unit7133-telco
post7323-uadb
sun7335-ukhrms
burp7133-wfnmreply
각 줄의 숫자 뒤의 시작 알파벳 문자와 문자를 무시하고 고유 숫자 수를 얻으려면 어떻게 해야 합니까? (또는) 각 행의 숫자 값만 검색하고 고유 개수를 얻는 방법.
숫자 값만 추출했다는 점을 고려하면 다음과 같습니다.
7433
7433
7333
7333
7333
7330
7331
7333
7330
7333
7333
6333
7323
7133
7323
7335
7133
이제 숫자 값의 고유 개수를 검색하고 싶습니다. 따라서 중복을 무시하고 다음과 같은 최종 출력을 얻어야 합니다.
8
나는 이것을 사용하여 이것을 할 수 없다앗또는sed심지어 단순하다쿼리 | 잘라내기
값 목록을 추출할 필요가 없으며 최종 개수를 답으로 원합니다.
도와주세요!
답변1
grep
숫자만 필터링하려면 ,를 사용하세요 .
grep -Eo '[0-9]+-' file | sort -u | wc -l
[0-9]
0에서 9(모든 숫자) 사이의 모든 문자와 일치합니다.+
존재하다확장 정규식최소한 하나의 문자를 나타냅니다. 이것이 바로-E
이 옵션이 와 함께 사용되는 이유 입니다grep
. 따라서[0-9]+-
하나 이상의 숫자와 일치하고 그 뒤에-
.-o
패턴과 일치하는 부분만 인쇄하므로 입력이 주어지면abcd23-gf56
해당grep
부분만 인쇄됩니다23-
.sort -u
(으로 인해-u
) 고유 항목을 정렬 및 필터링하고wc -l
입력의 행 수(즉, 고유 항목 수)를 계산합니다.
답변2
당신은 그것을 사용할 수 있습니다 :
tr -dc '\-0-9\n' | sort -u -t- -nk1,1 | grep -c .
...물론 이것은 Mulu의 답변에서 영감을 얻은 것이 아닙니다. 그러나 차이점은 입력에 빈 줄이 있을 때가 grep
아니라 줄을 세는 데 익숙하다는 것입니다 . 일치하는 줄만 인쇄되므로 wc
그의 대답에는 빈 줄 문제가 없습니다.grep -o
( grep -c
여기서만 계산하세요), 하지만tr
하다개행 문자는 제거되지 않는 몇 안 되는 문자 중 하나이므로 빈 줄을 인쇄합니다. 즉, 입력에 빈 줄이 있으면 wc
결과가 1씩 왜곡됩니다.
따라서 tr
여기서 효율성은 계산 부서보다 높을 수 있지만 계산 부서를 능가 grep -o
할 수도 있습니다 . 나는 이 접근 방식을 좋아합니다. 이식성 때문이기도 하지만 일반적으로 가장 효율적인 필터를 먼저 사용하여 데이터를 정리한 다음 나중에 체인에서 덜 효율적인 필터를 사용하려고 하기 때문입니다.wc
grep
sort
이를 통해 ab 구분 기호로 분할된 숫자 순서에 따라 고유한 순서로 고려되는 행당 자릿수를 선택할 수 있습니다 . 입력에서 숫자, 대시 또는 개행 바이트의 보수를 제거합니다. 이 방법 - 대시가 나타나지 않는 한-u
-n
-k
-t-
tr
-d
-c
-
앞으로비교하려는 숫자 문자열의 경우 줄에 남은 유일한 것은 다음과 같습니다.
#nothing at all
...또는...
[numbers]
...또는...
[numbers]-[more numbers]more-dashes-...
따라서 출력이 파이프될 때 sort
대시(있는 경우) 앞에 나타나는 숫자 문자열만 비교하도록 지시합니다. 이렇게 하면 중요한 유일한 숫자는 계산하려는 숫자(대시 여부)입니다.
그런 다음 최소한 하나의 문자가 포함된 줄의 수를 grep -c
셉니다 . .
다음 명령은 다음을 인쇄합니다 8
.
tr -dc '\-0-9\n' <<\IN | sort -u -t- -nk1,1 | grep -c .
psf7433-nlhrms
unit7433-nobody
unit7333-opera
bpx7333-operations
app7333-osm
unit7330-partners
psf7331-pdesmond
unit7333-pro-09-0jm
mnp7330-redir09o-0ect
unit7333-retailbanking
cpq7333-rkarmer
unit6333-sales
ring7323-support
unit7133-telco
post7323-uadb
sun7335-ukhrms
burp7133-wfnmreply
IN
답변3
확장 grep을 사용하여 4자리 숫자를 찾고, grep에게 일치하는 항목만 나열하도록 지시합니다(기본 전체 줄 대신).
grep -Eo '[0-9]+' <filename>
이 숫자 목록을 정렬하고 고유한 숫자만 출력합니다.
sort -u
행 수를 계산합니다.
wc -l
함께 넣어보세요:
$ grep -Eo '[0-9]+' filename | sort -u | wc -l
8
답변4
해결책awk
awk -F'-' '{sub(/[^[:digit:]]+/, "", $1); a[$1]} END{for (k in a) ++i; print i}' file
8