私が作成したこの小さなforループでは、すべてのパラメータに対してこのメッセージを一度だけ印刷するループが必要です。
for arg in $@
do
echo "There are $(grep "$arg" cis132Students|wc -l) classmates in this list, where $(wc -l cis132Students) is the actual number of classmates."
done
$ argには、ファイルに存在する複数の名前とファイルに存在しない複数の名前が含まれています。ループは各パラメータに対してメッセージを複数回印刷しますが、私は一度だけ印刷したいと思います。
答え1
パラメータを一度に1つずつ読み込んでパラメータを繰り返して、各パラメータに対してechoステートメントを一度に実行したくありません。
次のことができます。
#!/bin/sh
student_file=cis132Students
p=$(echo "$@" | tr ' ' '|')
ln=$(wc -l "$student_file")
gn=$(grep -cE "$p" "$student_file")
echo "There are $gn classmates in the list, where $ln is the actual number of classmates."
p
:拡張正規表現モードでgrepに入力できる文字列に変換します。たとえば、パラメータを指定した場合は、jesse jay
次のように変換されますjesse|jay
ln
。 :入力ファイルの総行数(生徒)
gn
:パラメータ検索に一致する生徒の数
答え2
別の解決策:
$ cat cis132Students
peter
paul
mary
$ cat file
peter
mary
lucy
$ echo "There are $(grep -cf file cis132Students) classmates in this list, where $(wc -l <cis132Students) is the actual number of classmates."
There are 2 classmates in this list, where 3 is the actual number of classmates.
grep -cf file cis132Students
:パラメータ-f file
入力file
ファイルをパターンとして指定grep
し、-c
一致する行数を計算します。wc -l <cis132Students
ファイル名なしで行数を出力します。