“wc -l”을 사용하여 파일 이름없이 줄 수만 인쇄하는 방법은 무엇입니까?


155
wc -l file.txt

줄 수와 파일 이름을 출력합니다.

파일 자체가 아닌 숫자 자체 만 있으면됩니다.

나는 이것을 할 수있다

 wc -l file.txt | awk '{print $1}'

그러나 더 좋은 방법이 있습니까?


13
wc -l < file.txt작업을 정확하고 간결하게 수행합니다.
Jonathan Leffler


3
이것은 지금 두 번 찾은 질문입니다. wc의 이러한 행동은 -nix 평범한 간결함에있어 직관적이지 않으며 패러다임이 아닙니다. 당신이 때문 간결성은 이유가 정확하지 않는 솜털 중복 모든 종류의 주변에 작업 할. 결국, 나는 파일 이름을 안다 . 내가 원하는 것은 줄 수입니다.
피터-복원 모니카

답변:


217

이 방법으로 시도하십시오 :

wc -l < file.txt

5
AIX, ksh에서는 항상 숫자 앞에 공백이 있습니다. 우리는 사용해야합니다 | awk '{print $ 1}'또는 잘라내어 공백을 제거합니다. 트리밍하는 또 다른 방법은 에코로 묶는 것입니다.
rao

@rao가 맞습니다. 숫자 앞에 공백이 추가됩니다. 내 솔루션은 이것을 해결하고 awk 또는 cut보다 간단합니다.
Desi Cochrane

@rao bash에는 공간이 없습니다. ksh에서 우주는 어디에서 왔습니까? wc -l하나를 방출해서는 안되며 ksh가 왜 프로그램의 표준 출력에 공백을 추가합니까?
피터-복원 모니카

이것이 올바른 해결 방법이지만 화장실이 수정되지 않는 것은 쉽지만 느리고 직관적이지 않을 수 있습니다. 하나, 나는 4711 [stdin]출력 과 같은 것을 기대할 것 입니다.
피터-복원 모니카

또한 printf "%'d"공간을 관리하고 많은 수를 멋지게 인쇄하는 와의 페어링을 고려하십시오 .
레오

21
cat file.txt | wc -l

매뉴얼 페이지 에 따르면 (BSD 버전의 경우 확인할 GNU 버전이 없습니다).

파일을 지정하지 않으면 표준 입력이 사용되며 파일 이름이 표시되지 않습니다. 대부분의 환경에서 EOF 또는 [^ D]를 수신 할 때까지 프롬프트가 입력을 수락합니다.


3
나는 고양이를 좋아하지 않는다-연결은 많은 시간을 소비한다.
PoGibas

9
wc -l < file.txt같은 효과가 있습니다.
pjmorse

@user : 테스트 해보십시오. 가장 느린 부분은 디스크에서 파일을 읽는 것입니다.
sarnold

11
@ user1286528 wc -l < file.txt은 고양이의 쓸모없는 사용을 피하기 위해 사용 합니다. 그것이 눈에 띄는 시간을 소비한다고 생각한다면 당신은 완전히 미쳤지 만.
hobbs

12

선행 공간 없이이 작업을 수행하려면 왜 안됩니까?

wc -l < file.txt | bc

이것으로 구문 오류가 발생합니다 (Ubuntu 14.04). 파일 이름에 문제가 있다고 생각합니다.
MERose

RHEL 6.7에서는 다음 오류가 발생합니다. $ wc -l file.csv | bc (standard_in) 1 : 구문 오류 (standard_in) 1 : 잘못된 문자 : N (standard_in) 1 : 구문 오류 (standard_in) 1 : 구문 오류
Rodrigo Hjort

3
또한 구문 분석 오류가 발생하지만 구문 분석 오류 wc -l < file.txt를 수정하고 공간을 제거하는 데 사용하는 다른 답변과 이것을 결합 할 수 있습니다 .wc -l < file.txt | bc
jangosteve

11

어때요?

wc -l file.txt | cut -d' ' -f1

즉, 출력 wccut(구분자가 공백이고 첫 번째 필드 만 선택)에 파이프


4
이것은 wc -l file.txt | awk '{print $1}'OP가 시도한 것보다 낫지 않습니다 .
doubleDown

1
wc -l < file.txt방법 보다 빠릅니다 . 그러나 명령이 선행 공간 (예 : "34068289 file.txt"대신 "34068289 file.txt")을 리턴하는 한 | cut -d' ' -f2BSD에서 사용해야합니다 wc.
Sopalajo de Arrierez

@doubleDown은 awk를 사용하는 것이 CNC 기계를 사용하여 톱 대신 보드를 자르는 것과 같습니다. 톱질에는 톱을 사용하십시오.
피터-복원 모니카

5

기술 비교

에서 제공하는 선행 공백없이 문자 수를 얻으려고하는 비슷한 문제가 있어서이 wc페이지로 연결되었습니다. 여기에 대한 답변을 시도한 후 다음은 Mac (BSD Bash)에서의 개인 테스트 결과입니다. 다시 말하지만 이것은 문자 수입니다. 줄 수를 위해 당신은 할 것 wc -l입니다. echo -n후행 줄 바꿈을 생략합니다.

FOO="bar"
echo -n "$FOO" | wc -c                          # "       3"    (x)
echo -n "$FOO" | wc -c | bc                     # "3"           (√)
echo -n "$FOO" | wc -c | tr -d ' '              # "3"           (√)
echo -n "$FOO" | wc -c | awk '{print $1}'       # "3"           (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1         # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8         # "3"           (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//'    # "3"           (√)
echo -n "$FOO" | wc -c | grep -ch '^'           # "1"           (x)
echo $( printf '%s' "$FOO" | wc -c )            # "3"           (√)

cut -f*주어진 출력이 가질 수있는 정확한 선행 공간 수를 알아야하므로 일반적으로 방법에 의존하지 않습니다 . 그리고 grep하나는 문자를 세지 않고 줄을 세는 데 효과적입니다.

bc가장 간결하고, awk그리고 perl약간의 과잉을 보이지만, 그들은 모두 상대적으로 빠르고 휴대 충분합니다.

또한 이들 중 일부는 일반 문자열에서 ( echo `echo $FOO`다른 깔끔한 트릭 과 함께) 주변 공백을 자르도록 조정할 수 있습니다 .


1
echo $(printf '%s' "$FOO" | wc -c)echo명령 치환 으로 쓸모없는 드문 경우 중 하나입니다 .
tripleee

@tripleee Whoa ... 코드를 기반으로 echo `echo $FOO`;변수에 대한 String.trim () 명령처럼 작동합니다! 놀랍도록 편리합니다. 또한 귀하의 답변을 내 답변에 추가하겠습니다.
Beejor

아마도 문맥에 대해서는 셸 변수 주위에 따옴표를 감쌀 때를
tripleee


4

어때요?

grep -ch "^" file.txt

3
좋은. 매우 독창적이고 독창적 인 사용 grep이지만 이것을 확인하면 wc테스트에서 보다 간단하고 직접적인 방법 보다 2 배에서 6 배 느리게 나타납니다 .
arielf

3

분명히, 이것에 대한 많은 해결책이 있습니다. 여기 또 다른 것이 있습니다.

wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"

이것은 단지 라인의 수를 출력하지만, 후행 개행 문자 ( \n) 당신이 그 중 하나를 원하지 않는 경우, 교체, 존재 [:blank:]와 함께 [:space:].


파일 이름에 숫자가 있으면 문제가 있습니다. 예를 들어 test9, 한 줄이 들어있는 파일의 경우 출력은 19입니다.
Raphael Ahrens

1

가장 좋은 방법은 먼저 디렉토리의 모든 파일을 찾은 다음 AWK NR (레코드 수 변수)을 사용하는 것입니다

아래는 명령입니다.

find <directory path>  -type f | awk  'END{print NR}'

예 : - find /tmp/ -type f | awk 'END{print NR}'


0

나를 위해이 작품은 정상를 사용 wc -l하고 sed숫자가 아닌 무엇인지 어떤 문자를 제거 할 수 있습니다.

wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"

# 9249133
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.