という設定ファイルがあります。学生
grade1 class1 11 student
grade1 class1 12 student
grade2 class1 21 student
grade2 class2 22 student
......
今私はテストファイルファイルを読む学生です。グレード名とグレードを入力すると、2つの文字列を含む行がコピーされます。学生のコピー。コードは以下のように表示されます。
echo Input gradename and studentnumber
read gradename
read studentnumber
if (input gradename and studnetnumber);
then
echo "the line include them" >> student_copy
たとえば、
if (input grade1 and 11);
then
echo grade1 class1 11 student >> student_copy
答え1
grep
論理的ではないそしてタスク(例えばmatch patternA AND patternB
)に最も近いタスクは、可能なバリアント(たとえばgrep -E 'patternA.*patternB|patternB.*patternA'
)に一致するように長い正規表現を設定することです。一致するパターンが多いと、非常に不器用で扱いにくくなることがあります。
必要なものを達成する最も簡単な方法は、代わりにスクリプト言語(awk
または)をperl
使用することですgrep
。
たとえば、次の行awk
は、両方のパターンが発生するすべての行と一致します。
awk '/patternA/ && /patternB/'
たとえば、パターンAは含まれているがパターンBは含まれていない行を一致させたい場合は、すべてのパターン一致を元に戻すことができます。まさかタスク):
awk '/patternA/ && ! /patternB/'
注:簡単な方法はgrep patternA | grep patternB
(またはgrep patternA | grep -v patternB
)を使用することです。するgrep
論理AND(またはAND NOT)を実装しますが、単一またはawk
コマンドperl
の代わりに複数のコマンドを実行する必要があります。
答え2
grade1
合計がある行を探したいとしましょう11
。
サンプルデータ(質問のデータとは異なります)と検索キー:
$ cat student
grade1 class1 11 student
grade1 class1 111 student
grade11 class1 21 student
grade12 class2 22 student
$ grade=grade1
$ num=11
\<
単語の端に一致する/アンカーに注意しながら、与えられた文字列を直接把握します。\>
これには次の順序が必要です。
$ grep "^$grade\>.*\<$num\>" student
grade1 class1 11 student
または-w
完全な単語を一致させるには。
$ < student grep -w "$grade" |grep -w "$num"
grade1 class1 11 student
上記の両方は、行の他の場所で同様の単語と一致する可能性が高いため、awkを使用してこれを実行し、適切なフィールドのみを比較する方が良いかもしれません。これは、フィールドがスペースで区切られているため、スペース自体を含めることができないと仮定します。
$ awk -vg=$grade -vn=$num '$1 == g && $3 == n' student
grade1 class1 11 student
スペースを含むフィールドが必要な場合は、タブなどの他の区切り文字を使用することをお勧めします。
答え3
以下でこのコマンドを実行しています。
awk '{
if ($1!="grade1" || $3!=11)
print "###";
else
print $0;
}' student
出力は次のとおりです
grade1 class1 11 student
###
###
###
これは予想される出力です。
しかし、私が走ったらテストファイル、コードは次のとおりです。
read -p "Enter gradename: " gradename
read -p "Enter studentnumber: " studentnumber
echo "gradename = $gradename"
echo "studentnumber = $studentnumber"
awk '{
if ($1!="$gradename" || $3!=$studentnumber)
print "###";
else
print $0;
}' student > student2
cat student2
その後、出力は次のようになります。
Enter gradename: grade1
Enter studentnumber: 11
gradename = grade1
studentnumber = 11
###
###
###
###
非常に奇妙な
答え4
私はかつてawkのライナーの下で同じものを見つけ、うまくいきました。
for i in `awk '{print $1}' student.txt| sed -r "s/\s+//g"| sed '/^$/d'| sort -u` ; do awk -v i="$i" '$1 ~ i && $3 == "11"{print $0}' student.txt ; done
生徒番号11を定数として確認したので、スクリプトで$ 3 = = 11に言及しました。
「i」の変数である Grade1 と Grade2
お客様の要件に応じて学位を変更することができます。必要に応じて $3=="Freshman Number" の値を変更します。