다음과 같이 표준 입력의 각 줄에 대해 명령을 호출하고 싶지만 xargs
해당 줄은 명령줄 인수가 아닌 표준 입력으로 전달되어야 합니다.
cat some-file.txt | <magic> | wc -c
- 그러면 파일의 각 줄에 있는 문자 수가 인쇄됩니다.
내 옵션은 무엇입니까?
답변1
간단한 루프는 어떻습니까?
while IFS= read -r line ;
do
printf "%s" "$line" | wc -c
done < some-file.txt
답변2
읽는 동안 루프가 가장 명확합니다. xargs를 사용하여 각 행에 대해 작업을 수행하려는 경우 다음과 같은 괴물이 발생할 수 있습니다.
printf "%s\n" "foo bar" one " 1 2 3" |
xargs -d '\n' -n 1 -I LINE bash -c 'wc -c <<< "LINE"'
8
4
7
각 라인마다 bash 프로세스를 생성해야 하기 때문에 비용이 많이 듭니다.
답변3
cat file.txt | while IFS= read -r i; do echo -n "$i" | wc -c; done
## or (better):
while IFS= read -r i; do echo -n "$i" | wc -c; done < file.txt
그러나 이는오직한 번에 한 줄씩 한 줄의 문자 수를 인쇄합니다. 더 읽기 쉬운 것을 원한다면 다음 중 하나를 원할 수 있습니다.
## Prints the contents of each line underneath the character count:
while IFS= read -r i; do echo -n "$i" | wc -c; echo "$i"; done < file.txt
## Prints the line number alongside the character count:
n=0; while IFS= read -r i; do n=$((n+1)); echo -n "line number $n : "; echo -n "$i" | wc -c; done < file.txt
이식성을 높이기 위해 all printf '%s' "$i"
대신 사용할 수 있습니다 .echo -n
답변4
Z 쉘
옵션을 사용하면 행을 변수에 저장하는 것을 피할 수 있습니다.-e
setopt pipefail
cat some-file.txt |
while read -re | wc -c
do
done
-r
\
s를 있는 그대로 읽으세요.
-e
입력을 변수에 할당하는 대신 에코 입력
pipefail
이 작업을 수행하면 파일 끝에 나타나는 read -re | wc -c
0이 아닌 상태 코드로 종료 됩니다.read -re
안타깝게도 이 옵션은 Bash에서는 사용할 수 없습니다.