추가 분석을 위해 텍스트 파일에서 패턴을 식별해야 합니다. 따라서 입력 파일에는 아래와 같이 반구조화된 텍스트가 포함될 수 있습니다.
파일 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의 하위 문자열을 계산합니다. 예를 들어 \w
Perl의 문자 집합으로 구성된 "단어" 시퀀스를 계산하고 @
및.
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
샘플 파일용.