まあ、2つのフォルダがあります。単純化のためにplayers
sumと呼びますitems
。 items フォルダーには各アイテムのファイルが含まれ、 people フォルダーには各人物のファイルが含まれ、その人物が所有する動物への参照が含まれます。これが私が今まで持っているものです:
ls -1 ~/items | cut -d. -f1 | grep -R -f - ~/player
私が得たgrep構文ここ。私はそれを言おうとしています:
electric: 8
laser: 7
loltrail: 2
-c
代わりにフラグを追加して、grep
次のようにします。
Bob.txt: 0
Cathy.txt: 0
John.txt: 0
Patrick.txt: 1
一人当たりの商品の数ではなく、商品の総数を取得するにはどうすればよいですか?
これは、どれだけのプロジェクトが使用されているかを把握することです。店舗をクリックGarry's Mod用のプラグイン。
答え1
GNUを使用して目的の結果を得る方法は次のとおりですawk
。
awk '
BEGINFILE {
if (FILENAME ~ "^animals/" || FILENAME ~ "/animals/") {
this_name = substr(FILENAME, index(FILENAME,"animals/")+length("animals/"))
i = index(this_name, ".")
if (i > 0) this_name = substr(this_name, 1, i-1)
critter[++num] = this_name
critter_count[num] = 0
nextfile
}
}
{
for (i = 1; i <= num; i++) {
if ($0 ~ critter[i]) critter_count[i]++
}
}
END {
for (i = 1; i <= num; i++) print critter[i] ": " critter_count[i]
}
' animals/* people/*
新しいファイル()を起動するときに
BEGINFILE
名前が、またはanimals/
で始まることを確認してください/animals/
。もしそうなら、animals/*
./animals/*
~/animals/*
- 右部分文字列を抽出します
animals/
。 - 次に、1つを探し
.
、見つかったら、左側の部分文字列を抽出します。 - この文字列(デフォルトのファイル名、削除されたディレクトリ、および拡張子)を配列
critter[]
に追加し、その文字列をcritter_count
0に初期化します。
☛POSIX awkでは、およびは
BEGINFILE
使用nextfile
できません。- 右部分文字列を抽出します
- そうでない場合(ファイルを見ている場合
people
)、動物名を繰り返してcritter
一致する行数を数えます。 - すべての入力に達した後、
END
ファイル名から抽出された動物名animals
と各動物名がファイルに表示される頻度を報告しますpeople
。
これはディレクトリを再帰的に検索しませんpeople
。質問に必要な説明は表示されません。
答え2
grep
usingにパターンを入力すると、stdin
すべてのパターンの結果がリンクされると思います。私が知っている限り、この問題を解決する唯一の方法は、各パターンに対して新しいgrepインスタンスを呼び出すことです。
このスクリプトはこの場合に機能します。
for animalName in $(ls -1 ~/animals | cut -d. -f1);
do
echo "$animalName: $(grep -R -h -c $animalName ~/people | paste -sd+ | bc)";
done
これは、試したマイナーな変更の一部と一致します。まず、-h
オプションはgrep
ファイル名の印刷を無効にします。次に、を使用すると、grep
パターンの出力は次のようになります。
1
0
3
2
私たちはこの数字をすべて追加したいと思います。paste
このコマンドは行を a に連結+
し、結果文字列を渡してbc
結果を計算します。
注:動物名に改行や特殊文字(奇妙な場所)が含まれている場合は、解析をお勧めしませんls
。