상황은 다음과 같습니다. 여러 개의 *.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
사용 grep
및 wc
:
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