데모

데모

OSX에서 다음 명령을 사용하여 파일의 줄 수를 계산합니다.

nl=$(wc -l < ~/myfile.txt)

예를 들어 결과는 100입니다. 이제 그 결과를 다른 명령에 사용하고 싶은데 nl이상하게도nl

echo 1-$nl

1- 100대신 나한테 주세요 1-100.

데모

cv me$ nl=$(wc -l < ~/Desktop/cap.xlsx)
cv me$ echo $nl
104
cv me$ echo 1-$nl
1- 104

여기에 이미지 설명을 입력하세요.

여기에 이미지 설명을 입력하세요.

왜 이런 일이 발생합니까? 어떻게 얻을 수 있나요 1-100?

답변1

POSIX에서 정의한 대로 출력에는 wc다음 형식의 각 입력 파일에 대한 항목이 포함되어야 합니다.

"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>

그러나 출력 파일 형식 pseudo printf()-string은 System V 버전과 다릅니다 wc.

"%7d%7d%7d %s\n"

POSIX는 선행 공백을 추가할 필요가 없으므로 원하는 대로 자유롭게 수행할 수 있습니다. wc적어도 OSX 및 wcHeirloom Toolbox에는 출력에 선행 공백을 추가하는 다양한 구현이 있습니다 .

$ /usr/5bin/wc -l /tmp/file
      3  /tmp/file

GNU wc는 또한 옵션 없이 표준 입력에서 읽을 때 선행 공백을 추가합니다.

$ cat file | wc
  5       5      65

POSIX 셸에서 선행 공백을 모두 제거하려면 다음을 수행하세요.

set -f
set -- $nl
nl=$1
set +f

이 방법은 변수에 선행 또는 후행 공백만 포함되고 중간 공백은 포함되지 않는다고 가정합니다.ab.

답변2

wc구현 시 선행 공백이 생성될 수 있습니다. 이는 옵션이 사용되는지 여부(및 개수)에 따라 달라질 수 있습니다( wc예: GNU는 귀하의 경우처럼 하나의 옵션만 사용되는 경우 공백을 생성하지 않습니다). 이러한 공백은 작업에 유지됩니다 nl=$(...). 공백을 제거하려면 해결 방법으로 다음 방법 중 하나를 사용할 수 있습니다.

nl=$(wc -l < ~/myfile.txt | awk '{print $1}')

또는

nl=$(awk 'END{print NR}' ~/myfile.txt)

또는

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=$(echo $nl)

또는 (하지만 아래 @cuonglm의 설명을 참조하세요.가족 가보버전 wc)

nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=${nl##* }

답변3

가장 간단한 솔루션(bash 또는 기타 POSIX 셸에서):

nl=$(wc -l < ~/myfile.txt)
nl=$(($nl))

$((...))산술 확장 표준에 사용되므로 sh결과는 항상 숫자 자체입니다. 출력이 생성 되지 wc -l않으면(예: 파일을 읽을 수 없는 경우) 0대신 빈 문자열이 생성됩니다.

$((nl))에서도 작동할 수 있지만 bashPOSIX는 숫자 상수를 포함하지 않고 $nl실제로 작동하지 않으므로 이를 보장하지 않습니다.yash

다음을 사용하여 이 모든 작업을 한 번에 수행할 수도 있습니다.

nl=$(($(wc -l < ~/myfile.txt)))

이것의 장점은 종료 상태가 보존된다는 것입니다 wc.

답변4

선행 및 후행 공백을 제거하는 더 쉬운 빠른 수정 방법은 공백을 정수로 변환하는 것입니다.

echo 1-$nl

도착하다

echo 1-$(($nl))

관련 정보