특정 열에서 단어의 문자 수를 어떻게 얻습니까?


12

다음과 같은 CSV 파일이 있습니다.

abd,123,egypt,78
cde,456,england,45

세 번째 열 단어의 문자 수는 어떻게 알 수 있습니까?

wc이 작업을 수행 하는 방법을 알 수 없습니다 .

답변:


23
cut -d, -f3 | tr -d '\n' | wc -m

( wc -c문자가 아닌 바이트 수를 기억하십시오 :

$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -c
7
$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -m
6

)


그러나 그는 ' wc명령을 사용 하여 출력을 얻을 수 없습니다 !'라고 지정합니다.
mikeserv

3
@ mikeserv 는 문자 수를 줄 수 없어서wc 해석했기 wc때문에이 맥락에서 사용하는 방법을 보여줍니다 .
Stéphane Chazelas

아 .. 그것은 전혀 나에게 일어난 적이없는 매우 유효한 해석입니다.
mikeserv

22
awk -F, '{sum+=length($3)}; END {print +sum}' file

3
아멘; awk열 기반 파일을 한 줄씩 처리하도록 설계되었습니다. 문제는 공구에 완벽하게 적합합니다.
Ray

{print + sum}에서 +의 목적은 무엇입니까? {print sum}도 잘 작동합니다.
spuder

3
@spuder, 0입력 파일이 비어있을 때 빈 줄 대신 인쇄 됩니다.
Stéphane Chazelas

2
반면에 @Ray awk는 전형적인 Unix 정신으로 사례에 협력하는 3 개의 기본 유틸리티 (각각 크기의 일부 임)를 가지고 작업을 수행 할 수 있습니다 . cut + tr + wc가 5보다 빠르다는 것을 알 수 있습니다. awk보다 5 배 빠릅니다 perl. (적어도 내 시스템에서는 UTF8 로캘로 100MB 파일에서 시도했습니다).
Stéphane Chazelas

5

perl솔루션 :

perl -Mopen=:locale -F, -anle '$sum += length($F[2]); END{print $sum}' file

또는 더 짧은 버전 :

perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file

반드시 문자 수는 아니지만 바이트 수를 반환합니다.
Stéphane Chazelas

@StephaneChazelas : length ()는 perldoc에 따라 물리적 바이트가 아닌 논리적 문자 수를 반환합니다.
cuonglm

하지만 당신은 필요 -Mopen=:locale에 대한 perl문자가 무엇인지 사용자 / 시스템의 정의를 사용하는 것이 그렇지 않으면 문자가 바이트 가정합니다. a,1,españa,2UTF-8 로켈에서 입력을 시도하십시오 (대부분의 시스템에서 기본값).
Stéphane Chazelas

@ StephaneChazelas : 오, 내 대답을 업데이트했습니다. 좋은 지적 감사합니다!
cuonglm

3
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA

#OUTPUT
12

3

당신은 또한 사용할 수 있습니다

awk -F, '{printf "%s", $3}' file | wc -m

3

펄에서 :

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file

1

샘플 파일을 다음과 같이 사용하십시오.

$ cat sample.txt 
abd,123,egypt,78
cde,456,england,45

$ awk -F, '{print $3}' sample.txt | while read i; do echo "$i" | \
    tr -d '\n' | wc -m; done
5
7

wc각 줄의 수를 알아내는 작업은 까다로울 수 있습니다. 3 열의 각 문자열에 대해 개별적으로 호출해야하므로 원하는 것을하기가 약간 까다로워집니다. CSV의 각 행을 살펴보고 열 3을 추출한 다음 제시 wc하여 문자 수를 가져와야합니다.


0

사용 sed하여awk

sed 's/.*,.*,\(.*\),.*/\1/g' file | awk -v FS="" '{print NF;}'

예:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | sed 's/.*,.*,\(.*\),.*/\1/g' | awk -v FS="" '{print NF;}'
5
7

두 개의 awk

awk -F, '{print $3}' file | awk -v FS="" '{print NF;}'

예:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.