BASH: 문서의 각 줄에 있는 단어 수 계산

BASH: 문서의 각 줄에 있는 단어 수 계산

추가 분석을 위해 텍스트 파일에서 패턴을 식별해야 합니다. 따라서 입력 파일에는 아래와 같이 반구조화된 텍스트가 포함될 수 있습니다.

파일 1

905:john: abc123: [email protected]: US  
920:eric: ericaA: [email protected]: US  
1000: rio: ri0ri0: [email protected]: IN  

파일 2

nathen <tab> [email protected] <tab> 764323545 <tab> UK
thomas <tab> [email protected] <tab> 563363421 <tab> UK
ian <tab> [email protected] <tab> 3453245472 <tab> SP

줄당 단어 수는 문서마다 다를 수 있습니다. 구분 기호도 다양하지만 각 문서마다 고유합니다. 내가 원하는 것은 각 문서의 한 줄당 단어 수를 계산하는 것입니다.

출력은 다음과 같습니다:

파일 1의 경우

5  
5 
5 
5   

파일 2의 경우

4  
4 
4 
4

나는 이것을 구분 기호가 있는 모든 파일에 일반화하고 싶습니다. 그것은 수 - | : \space+ \tab+.

일부 문서는 다음과 같습니다.

| [email protected] | er34532 |  
| [email protected] | 764474 |

답변1

file2의 간단한 형식과 공백으로 구분된 단어의 경우 다음을 시도해 보세요.

$ awk '{print NF}' file2
4
4
4

awk에서는 NF필드 수입니다. 기본적으로 awk에서는 단어 문자가 공백으로 구분됩니다.

:file1의 경우 단어는 콜론이나 공백으로 구분할 수 있으므로 필드 구분 기호에 다음을 추가해야 합니다 .

$ awk -F'[: \t]+' '{print NF}' file1
5
5
5

개선하다

행에 선행 또는 후행 공백이 있으면 awk는 추가 필드가 있다고 가정합니다. file1과 마찬가지로 필드를 계산하기 전에 이러한 공백을 제거하여 이 문제를 해결할 수 있습니다.

awk -F'[: \t]+' '{gsub(/^[: \t]+|[: \t]+$/, ""); print NF}' file1

또는 file2는 다음과 같습니다.

awk '{gsub(/^[[:space:]]+|[[:space:]]+$/, ""); print NF}' file2

정규식에서는 ^[[:space:]]+선행 공백 및 [[:space:]]+$후행 공백과 일치합니다. 명령에서 해당 조합을 사용하면 gsub둘 다 제거됩니다.

일반화하다

필드 구분 기호가 - |: 또는 중 하나일 수 있는 경우 다음을 사용하십시오.

awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}'

예:

$ cat file3
| [email protected] | er34532 |  
| [email protected] | 764474 |
$ awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}' file3
2
2

답변2

당신이 사용할 수있는이 트릭선택한 단어 정규식과 일치하는 Perl의 하위 문자열을 계산합니다. 예를 들어 \wPerl의 문자 집합으로 구성된 "단어" 시퀀스를 계산하고 @.

perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' somefile

이것은 만든다

$ perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' file1
5
5
5

그리고

$ perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' file2
4
4
4

샘플 파일용.

관련 정보