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