다음과 같은 bash 쉘 스크립트가 있다고 가정해 보겠습니다.
#!/bin/bash
export count=0;
for i in `ls ./mydoc` ;do
pdfinfo ./mydoc/$i | egrep Pages |awk {'print $2'} |xargs -+ $count ;
^^^^^^^^^^^^^^^^^
done;
echo $count;
각 PDF 파일의 페이지를 열거하지만 함께 추가하는 방법을 모르겠습니다. !!!!
답변1
그냥 awk로 하고 xargs는 잊어버리세요.
awk '{total += $2} END {print total}'
그러나 awk를 한 번만 실행하고 루프의 모든 출력을 여기에 파이프하면 됩니다. 별도의 grep을 제거하지 않겠습니까?
for i in mydoc/* ; do
pdfinfo $i
done | awk '/^Pages/ { total += $2 } END { print total }'
답변2
내장된 계산 방법을 사용해 보세요.
#!/bin/bash
count=0
for i in ./mydoc/* ; do
count=$(( $count + $(pdfinfo "$i" | grep Pages |awk {'print $2'}) ))
done
echo $count
답변3
Alan의 awk
답변은 훌륭하지만 다음을 xargs
사용하는 일반적인 솔루션이 있습니다 bc
. 아이디어는 xargs
공백으로 구분된 한 줄에 모든 숫자를 연결하는 데 사용할 수 있는 숫자 목록을 생성한 다음 sed
공백을 +
문자로 변경하는 데 사용할 수 있는 것입니다( tr
이 역시 작동함). BC에 파이프하십시오.
동일한 방법을 사용하여 문자열/정규식 목록에서 정규식을 구성할 수 있습니다. 대신 공백을 |
(확장 정규식) 또는 \|
(기본 정규식) 으로 변경하면 됩니다 +
.
for i in mydoc/* ; do pdfinfo $i ; done | \
awk '/^Pages/ {print $2}' | xargs | sed -e 's/ /+/g' | bc
참고: xargs는 수천 개의 숫자가 생성되면 쉘의 명령줄 길이 제한을 초과하여 여러 줄을 생성할 수 있습니다. bc
" 의 출력 이후어떤 방식으로든 숫자 목록 생성"인 경우 해결책은 출력을 bc
다시 파이프하는 것입니다 xargs | sed -e 's/ /+/g' | bc
.
for i in mydoc/* ; do pdfinfo $i ; done | \
awk '/^Pages/ {print $2}' | xargs | sed -e 's/ /+/g' | bc | \
xargs | sed -e 's/ /+/g' | bc
xargs | sed -e 's/ /+/g' | bc | xargs | sed -e 's/ /+/g' | bc
물론 이를 쉘 스크립트, 함수 또는 별칭에 넣을 수 있습니다.
다음은 이 방법을 사용하여 정규식을 구성하는 예입니다. search.txt에 foo, bar, baz, quux(한 줄에 한 단어)가 포함된 경우:
$ cat search.txt | xargs | sed -e 's/ /|/g'
foo|bar|baz|quux
쓸모없는 use-of-cat는 이 예의 자리 표시자입니다. 단어 목록이나 정규식 패턴을 생성하는 파이프로 대체됩니다.
검색 패턴에 공백 문자가 포함되어 있는 경우 입력을 파이프하기 전에(입력에 나타날 가능성이 적은 항목 선택) 이를 임시로 다른 것으로 변경해야 합니다 . 예를 들어 search.txt의 "bar" 줄에 있는 경우입니다 xargs
. sed
후행 공백이 있습니다.
$ cat search.txt | sed -e 's/ /XXX_SPACE_CHARACTER_XXX/g' | xargs | sed -e 's/ /|/g' -e 's/XXX_SPACE_CHARACTER_XXX/ /g'
foo|bar |baz|quux