bash의 wc에서 정수만 가져옵니다.


115

wc가 bash에서 반환하는 정수를 얻는 방법이 있습니까?

기본적으로 파일 이름 뒤에 줄 번호와 단어 수를 화면에 쓰고 싶습니다.

output: filename linecount wordcount 지금까지 내가 가지고있는 것은 다음과 같습니다.

files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

답변:


57

cut명령을 사용하여 wc의 출력 의 첫 번째 단어 (줄 또는 단어 수) 만 가져올 수 있습니다 .

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

5
동일한 파일에 대해 wc를 두 번 실행하는 것은 비효율적입니다.
gawi

3
사실, 이것이 James Broadhead의 대답이 훨씬 낫다고 생각하는 이유입니다. 필드 사이의 공백 수가 다르기 때문에의 cut전체 출력에 대해 작업 할 수 없었습니다 wc $f.
casablanca

1
@casablanca 'tr -s'를 사용하여 공백 수를 줄일 수 있습니다. 이 질문에 대한 더 많은 휴대용 솔루션을 아래 답변에 나열했습니다.
루블

이 답변에 우리는 변수에 할당하고 있기 때문에, 우리는 공간을 죽일 수
cycollins

88

가장 간단한 대답 :

wc < filename 

5
그러나 원하는 출력을 생성하지 않습니다.
Dave Newton

확실히 그렇습니다. 어쨌든 적절한 매개 변수를 전달하기 만하면됩니다. 예를 들어를 수행 wc -c < file name하면 정수 바이트 수만 제공되고 다른 것은 제공되지 않습니다.
BananaNeil 2012 년

13
내 요점은)는 (1.5 년짜리) 질문에 대답하려고하는 경우뿐만 아니라 모든 :)의 대답에 모든 정보를 넣을 수도 있었다
데이브 뉴턴

으악, 그냥 다시 읽기 ... #fail, 내가 얻는 방법을 연구했다 질문 단지 정수를하고, 내가 더 나은 해답을 발견 답변 한 정보를 사용하고 그것에 대해 게시하기로 결정했습니다. 죄송합니다 ..
BananaNeil

3
Google에 대답하셨습니다. 그게 중요합니다. :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

82

다만:

wc -l < file_name

일을 할 것입니다. 그러나이 출력에는 wc숫자 를 오른쪽 정렬 할 때 접두사가 붙은 공백이 포함됩니다 .


3
공백없이 단지 라인 카운트를 얻으려면 : wc -l < foo.txt | xargs심판 - stackoverflow.com/a/12973694/149428
테일러 Edmiston

1
따라서 명령이 선행 공백으로 답변을 생성하는 동안 질문자는 변수에 할당하고 선행 공백을 자동으로 삭제합니다 (적어도 이전 OSX bash에 대한 경험이었습니다). 즉, lines=`wc -l < $f`값 앞에 공백이없는 변수 "line"이 생성됩니다.
cycollins

find로 파이핑하면 어떻게 되나요? 오류가 발생합니다. find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l정상적으로 작동하지만 모든 파일을 인쇄합니다. 사용 find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <하면 오류가 발생합니다. parse error near '\n'
Nuno Gonçalves

55
wc $file | awk {'print "$4" "$2" "$1"'}

레이아웃에 맞게 조정하십시오.

또한 부정적 ( "디렉토리 아님")보다 긍정적 인 논리 ( "파일 임")를 사용하는 것이 더 좋습니다.

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

1
Cmder에서 내 Windows (bash는 4.4.12)이 작품에 : wc $file | awk '{print $4" "$2" "$1}'- 외부 아포스트로피 {}.
Grzegorz Gierlik

36

때때로 wc는 다른 플랫폼에서 다른 형식으로 출력합니다. 예를 들면 :

OS X에서 :

$ echo aa | wc -l

         1

Centos에서 :

$ echo aa | wc -l

1

따라서 컷만 사용하면 번호가 검색되지 않을 수 있습니다. 대신 tr을 사용하여 공백 문자를 삭제하십시오.

$ echo aa | wc -l | tr -d ' '

23

수락 된 / 인기있는 답변은 OSX에서 작동 하지 않습니다 .

다음 중 하나는 bsd 및 linux에서 이식 가능해야합니다.

wc -l < "$f" | tr -d ' '

또는

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

또는

wc -l "$f" | awk '{print $1}'

11

파일 이름을 리디렉션하면 wc출력에서 파일 이름이 생략됩니다.

세게 때리다:

read lines words characters <<< $(wc < filename)

또는

read lines words characters <<EOF
$(wc < filename)
EOF

를 사용하여 for의 출력을 반복 하는 대신 다음을 ls수행하십시오.

for f in *

공백을 포함하는 파일 이름이 있으면 작동합니다.

globbing을 사용할 수 없다면 while read루프 로 연결해야 합니다.

find ... | while read -r f

또는 프로세스 대체 사용

while read -r f
do
    something
done < <(find ...)

어쨌든 당신을 찬성했지만 파일 이름을 리디렉션 할 필요가 없습니다. 추가 필드로 캡처하십시오. read lines words characters filename <<< $(wc "$f")아, 그리고 *를 사용하여 공백에 대해 강화 된 경우 var를 사용할 때도 큰 따옴표를 사용하고 싶습니다.
Bruno Bronosky 2013 년

추가 변수를 사용하는 것은 실제로이를 수행하는 또 다른 방법이지만 변수를 사용하지 않을 $f경우 (이 경우 변수에 이미 파일 이름이있을 수 있음 ) 불필요합니다. 또한, 영업 이익은 얻는 방법에 대한 질문 단지 정수를. 당신은 변수 인용에 대해 맞았지만 변수의 사용을 보여주지 않았기 때문에 그 점을 언급하지 않았습니다. for f in *형태는 거의 항상 대신 출력을 사용하여 사용해야합니다 ls아시다시피.
추후 공지가있을 때까지 일시 중지되었습니다.

나는 ls요점 에 완전히 동의합니다 . 그것은 당신에게 상을 줄 것입니다. partmaps.org/era/unix/award.html#ls
브루노 Bronosky

파일 이름을 원하지 않는 경우 다음과 같이 할 수 있습니다.read lines words characters _ <<< $(wc "$f")

@EvanTeitelman : 위의 몇 가지 의견에서 논의한대로. $_다른 변수 일뿐입니다.
추후 공지가있을 때까지 일시 중지되었습니다.

3

파일이 작 으면 wc두 번 호출 할 여유가 있고 다음과 같은 것을 사용하여 추가 프로세스로 연결되는 것을 방지 할 수 있습니다.

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

$((...))는 IS 산술 확장 bash는의. wc이 경우 출력에서 공백을 제거합니다 .

당신이 필요로하는 경우이 솔루션은 더 의미 중 하나 linecount 또는 단어 수를.


2

어때요 sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'


1

숫자 결과를 보려면 다음을 시도하십시오.
nlines = $ (wc -l <$ myfile)


0

이 시도:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

줄 수와 단어 수 (LINE 및 WC)를 생성하고 wc에서 추출한 값 (첫 번째 열의 값에 $ 1 사용, 두 번째 열에 $ 2 사용)으로 값을 늘린 다음 결과를 인쇄합니다.


0

"기본적으로 파일 이름 뒤에 줄 번호와 단어 수를 화면에 쓰고 싶습니다."

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

출력 : myfile.txt 행 : 10 단어 : 20 바이트 : 120


0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

perl어쨌든 사용하는 경우 Perl에서도 단어 수를 계산할 수 있습니다. 보다 경제적 인 방법은 파이프로 연결하는 것입니다tr -d '[:space:]'
tripleee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.