だから私はテキストファイルの引数を受け入れ、そのファイルの総行数を出力するスクリプトを書いています。たとえば、私がこう言うと
./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
wc
2.「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...
そしてすべての内容を読んだら、=
入力の最後の行番号を報告します。$