Bashで複数のbashコマンドの結果をまとめる方法は?

Bashで複数のbashコマンドの結果をまとめる方法は?

だから私は

cat a1 | wc -l // term1
cat a2 | wc -l // term2
cat a3 | wc -l // term3
...
cat a10 | wc -l // term10

一行で計算したいですterm1 + term2 + ... + term10(長くても大丈夫です)。理想的には受け取りたいです。

$(cat a1 | wc -l) + ... $(cat a10 | wc -l)

答え1

人々は言う

cat a1 | wc -l

ウルムチ大学(猫を無駄に使用する)ただ書くことができるから

wc -l a1

しかし、あなたの問題については、次のように変更できます。便利な用途猫:

cat a1 a2 a3 ... | wc -l

このメソッドはwcファイル(ストリーム)を入力として使用し、合計を印刷します。

答え2

より簡単な方法:

awk 'END { print NR }' a1 a2 a3 ...

または

wc -l a1 a2 a3 ... | awk 'END { print $1 } '

ファイルが多い場合は、コマンドラインの長さ制限を超えないようにしてください。

find . -type f -name 'a[123]' -exec awk 'END { print NR }' {} + |
  {
    while read n; do
      tot=$(( tot + n ))
    done
    echo "$tot"
  }

catその形式に従う必要がある場合(例では、sを置き換える複雑なコマンドがあるため)、次のように使用できます。算術拡張:

echo $(( $(wc -l <a1) + $(wc -l <a2) + $(wc -l <a3) + ... ))

またはbc、より広い範囲の計算オプションのため:

echo "ibase=10; obase=10; $(wc -l <a1) + $(wc -l <a2) + ..." | bc

答え3

wc自分でまとめてみてください。すべてのファイルを同時に渡すことができ、wcは合計を計算します。

    wc -l a* | tail -n1

「すべて」の単語印刷をスキップしますwc

wc -l a* | sed '$!d;s/^ *\([0-9]*\) *[a-zA-Z]*/\1/'

オプションgrepの機能を使用して-h(たとえばGNU grep)ファイル名を省略して行数を計算し、cそれ.*xargsandにパイプしますpython

grep -ch '.*' a* | xargs -0i -- python3 -c 'import sys;print(sum(map(int, sys.argv[2].split())))' _Z_ {}

上記と同じですが、POSIXパラメータのみが適用されますgrep

grep -c '.*' a* | xargs -0i -- python3 -c 'import sys;print(sum(map(int, map(lambda x: x.split(":")[1], sys.argv[2].split()))))' _Z_ {}

関連情報