xargs를 사용하여 awk 또는 다른 표현식의 출력을 합산하는 방법

xargs를 사용하여 awk 또는 다른 표현식의 출력을 합산하는 방법

다음과 같은 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

관련 정보