すべてのファイルで特定の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

答え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

関連情報