すべてのファイルで特定の2行の文字数を計算し、そのファイル名を使用して合計を印刷します。

すべてのファイルで特定の2行の文字数を計算し、そのファイル名を使用して合計を印刷します。

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

おすすめ記事