![텍스트 파일에서 단어의 모든 반복 위치(단어 수 기준)](https://linux55.com/image/167883/%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%8B%A8%EC%96%B4%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EB%B0%98%EB%B3%B5%20%EC%9C%84%EC%B9%98(%EB%8B%A8%EC%96%B4%20%EC%88%98%20%EA%B8%B0%EC%A4%80).png)
텍스트에 단어가 나타나는 횟수와 마찬가지로 텍스트 파일에서 해당 단어의 모든 인스턴스에 대해 단어가 나타나는 위치를 찾고 싶지만 어디서부터 시작해야 할지조차 모릅니다. 루프와 grep과 wc의 조합이 필요하다고 생각합니다.
예를 들어, 다음은 iPhone 11에 관한 기사입니다.
화요일, 회사는 자사의 보급형 iPhone 11 휴대폰이 작년 유사한 모델의 750달러에 비해 700달러부터 시작할 것이라고 밝혔는데, 이는 Apple이 더 비싼 휴대폰을 구입하기 위해 서두르지 않는 소비자에게 초점을 맞추고 있다는 신호입니다. 년도.
Apple은 고급 모델인 iPhone 11 Pro와 iPhone 11 Pro Max의 시작 가격을 각각 1,000달러와 1,100달러로 유지했습니다. 회사는 실리콘밸리 캠퍼스에서 90분간의 기자회견을 통해 새 휴대폰을 출시했습니다.
본문은 총 81단어입니다.
jaireaux@macbook:~$ wc -w temp.txt
81 temp.txt
"iPhone"이라는 단어가 세 번 나타납니다.
jaireaux@macbook:~$ grep -o -i iphone temp.txt | wc -w
3
내가 원하는 출력은 다음과 같습니다.
jaireaux@macbook:~$ whereword iPhone temp.txt
24
54
57
이 출력을 얻으려면 어떻게 해야 합니까?
답변1
GNU 도구를 사용하는 한 가지 방법은 다음과 같습니다.
$ tr ' ' '\n' < file | tr -d '[:punct:]' | grep . | grep -nFx iPhone
25:iPhone
54:iPhone
58:iPhone
첫 번째는 tr
모든 공백을 개행 문자로 바꾼 다음 두 번째는 모든 구두점을 제거합니다(그래서 iPhone,
단어로 찾을 수 있음). grep .
빈 줄을 건너뛰고(이러한 줄은 계산하지 않음) grep -n
출력에 줄 번호를 추가하세요 . 그런 다음 입력을 정규식으로 처리하지 말고 전체 줄에 걸쳐 있는 일치 항목만 찾아야 한다고 -F
지시합니다 (그래서 일치 항목으로 간주되지 않습니다 ). 질문에 기재한 숫자에 한 자리가 누락되어 있습니다.grep
-x
job
jobs
숫자만 원하는 경우 다른 단계를 추가할 수 있습니다.
$ tr ' ' '\n' < file | tr -d '[:punct:]' | grep . | grep -nFx iPhone | cut -d: -f1
25
54
58
의견에서 지적했듯이 여기에는 여전히 aren't
or 와 같은 "단어" 문제가 있습니다 double-barreled
. 다음을 사용하여 개선할 수 있습니다.
tr '[[:space:][:punct:]]' '\n' < file | grep . | grep -nFx iPhone
답변2
tr 명령을 사용하여 모든 공백을 단일 개행 문자로 바꿉니다(압착 옵션 사용).
이를 nl -ba에 파이프하면 각 줄(및 단어)에 순차적으로 번호가 매겨집니다.
원하는 단어를 얻으려면 grep -F로 파이프하십시오. 그러면 해당 단어의 수와 텍스트만 표시됩니다.
awk도 프로세스에서 이 작업을 수행하지만 더 복잡해 보일 수 있습니다.
답변3
또 다른 옵션은 다음과 같습니다 sed
.
sed -e '/^$/d' -e 's/^[[:blank:]]*//g' < file | sed 's/[[:blank:]]/\n/g' | grep -ion "iphone"
산출:
25:iPhone
54:iPhone
58:iPhone
답변4
함수를 만듭니다.
$ whereword(){ grep -ion "$1" -<<<$(egrep -o "[^[:blank:]]+" "$2"); }
$ whereword iPhone tmp.txt
25:iPhone
54:iPhone
58:iPhone
$ whereword "aren't" tmp.txt
14:aren't