모든 파일에서 특정 두 줄의 문자 수를 계산하고 해당 파일 이름을 사용하여 합계를 인쇄합니다.

모든 파일에서 특정 두 줄의 문자 수를 계산하고 해당 파일 이름을 사용하여 합계를 인쇄합니다.

상황은 다음과 같습니다. 여러 개의 *.txt 파일이 있으며 각 파일에는 서로 다른 값 var또는 lab.

예를 들어:

abc.txt:

var^ABCDEFG
lab^ABCDEFGH

def.txt:

var^ABCDEFGHI
lab^ABCDEFGHIJ

각 .txt 파일 var^의 문자 수 합계를 인쇄하려면 명령이나 스크립트가 필요합니다. lab^예제 출력:

abc.txt: Total Characters in (Var and Lab) are 15.        (counting character after the caret ^ sign)
def.txt: Total Characters in (Var and Lab) are 19.

답변1

@steeldriver의 답변을 awk그렇지 않은 다른 구현 으로 확장 BEGINFILE하고 ENDFILE약간 지저분하지만 이식 가능하게 만듭니다.

awk -F'^' 'FNR==1{if (NR>FNR) printf("%s : Total characters in (Var) and (Lab) are %d\n",lastfile,sum); sum=0; lastfile=FILENAME} \
 NF==2 && ($1=="var" || $1=="lab") {sum+=length($2)} \
 END{printf "%s: Total characters in (Var) and (Lab) are %d\n", FILENAME, sum}' abc.txt def.txt

설명하다:

  • 파일 시작 부분(즉, FNR파일당 줄 카운터가 1임)에서 파일 이름을 임시 변수에 저장 lastfile하고 카운터 변수를 0으로 설정합니다.

  • 이것이 첫 번째 파일이 아닌 경우(즉, NR전역 행 카운터가 보다 큰 경우 FNR) 이전 파일의 통계를 출력합니다.

  • 이 규칙은 매개변수 목록의 마지막 파일을 캡처하지 않으므로 awk전역 블록의 논리도 복제해야 합니다 END.

답변2

다음과 같이 작동해야 합니다.

for file in *.txt; do \
  echo -n "$file: Total Characters in (Var and Lab) are "; 
  cut -d "^" -f 2 < $file | tr -d '\n' | wc -c;
done

산출:

abc.txt: Total Characters in (Var and Lab) are 15                                                                       
def.txt: Total Characters in (Var and Lab) are 15

답변3

GNU awk를 사용하여 이 작업을 수행할 수 있습니다.

gawk -F^ '
  BEGINFILE{count=0} 
  $1 == "var" || $1 == "lab" {count += length($2)} 
  ENDFILE{printf("%s: Total Characters in (Var and Lab) are %d\n", FILENAME, count)}
' ???.txt
abc.txt: Total Characters in (Var and Lab) are 15
def.txt: Total Characters in (Var and Lab) are 19

답변4

사용 grepwc:

for i in *.txt; do
  printf '%s: Total Characters in (Var and Lab) are %d.\n'\
    "$i"\
    "$(( $(grep -E '^(var|lab)' "$i" | wc -c) - 10 ))"
done

관련 정보