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 및 wc
Heirloom 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))
에서도 작동할 수 있지만 bash
POSIX는 숫자 상수를 포함하지 않고 $nl
실제로 작동하지 않으므로 이를 보장하지 않습니다.yash
다음을 사용하여 이 모든 작업을 한 번에 수행할 수도 있습니다.
nl=$(($(wc -l < ~/myfile.txt)))
이것의 장점은 종료 상태가 보존된다는 것입니다 wc
.
답변4
선행 및 후행 공백을 제거하는 더 쉬운 빠른 수정 방법은 공백을 정수로 변환하는 것입니다.
echo 1-$nl
도착하다
echo 1-$(($nl))