状況は次のとおりです。複数の *.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