引数として渡されたすべてのテキストファイルの総行数を出力するスクリプト

引数として渡されたすべてのテキストファイルの総行数を出力するスクリプト

だから私はテキストファイルの引数を受け入れ、そのファイルの総行数を出力するスクリプトを書いています。たとえば、私がこう言うと

./myScript file1 file2 file3

それは印刷されます

10 total

(これら3つのファイルのすべての行の合計は10であると仮定します。)

私はすべての主張を確認する方法を知っています。私はまた、ファイルの行数を取得するには、次のように言うことを知っています。

wc -l < fileName

しかし、これを一種の累積合計に追加できる「int」にどのように変更できますか?

答え1

cat単にパイプを使用して目標を達成できます。

cat "$@" | wc -l

実際に手動で合計を計算するには、awkを使用します。

for f in "$@"; do 
    wc -l < "$f"
done | awk '{ sum+=$1 } END { print sum }'

または、最後の行を解析するには、wc「total」文字列を削除します。

wc -l "$@" | awk 'END { print $1 }'

答え2

Jordanの答えに基づいて:

1. 単一インスタンスを介したすべてのデータ転送wc -l

    if["$#"-gt 0]
    それから
        猫——“$@”|トイレ-l
    その他
        エコ0
    フィリピン諸島
    
    または
     
    猫 - / dev / null "$ @"トイレ-l |
    
  • -- "$@"次に始まるファイル名を防ぐために使用されます。-
  • 引数なしで呼び出さないでくださいcat。これは標準入力を読みます。
  • これは恐ろしいの古典的な形であることに注意してください。cat a_single_file | something猫の無駄な使用、でも大丈夫です(まだ理想的ではありませんが)。cat one_or_more_file(s) | something

wc2.「total」ラインが放出されるという事実に依存

    if["$#"-gt 0]
    それから
        wc -l - / dev / null "$ @" | wc -l - / dev / null "$ @" |
    その他
        エコ合計0個
    フィリピン諸島
    
    または
     
    wc -l - /dev/null /dev/null "$@" | wc -l - /dev/null /dev/null "$@" |
    
  • wcこの行は、ファイル名引数が複数ある場合にのみエクスポートされます。total

3. 使用せawkずに使用wc

    if["$#"-gt 0]
    それから
        awk 'END {NR印刷}' - "$@"
    その他
        エコ0
    フィリピン諸島
    
    または
     
    awk 'END {print NR}' - / dev/null "$@"
    

警告する:

上記のコマンドは、ファイルの中で改行文字ではなく文字で終わる場合、すべて同じ応答を生成しません。

答え3

sed -ne\$= files...

sed代わりに、必要な数のファイル名を指定してください。files...そしてすべての内容を読んだら、=入力の最後の行番号を報告します。$

関連情報