私は新しいLinuxユーザーで、約2週間使用してきました。私は非常に簡単なプログラムを作成しようとしています。まず説明します。私は教育機関のオフィスの助手です。次の学年より1点低く60点以下の学生を定期的に報告しなければなりません。たとえば、私のレポートには次の種類のコンテンツが含まれています。
1. Michael 89
2. John 79
3. Oliver 79
.
.
.
20. Sarah 39
21. Twain 47
.
.
これまで、私は巨大なリストを見て、すべての学生を1つずつ記録する方法でこの作業を手動で行ってきました。しかし今、私はbashで私のためにこれを行う簡単なプログラムを作ることができると聞きました。私はgrepなどのいくつかのツールを使用して次のテストをフィルタリングできることを知っています。
[workstation24 ~] cat students_marks |grep 79
[workstation24 ~] cat students_marks |grep 89
[workstation24 ~] cat students_marks |grep 47
[workstation24 ~] cat students_marks |grep 39
.
.
.
また、以下の内容で簡単なプログラムを作成しました。
#!/bin/bash
grep '69\|79\|89'
うまくいきますが、このプログラムに60点未満のすべての学生をリストするように指示する方法がわかりません。 60(スコア)未満の生徒のリストを作成するには、プログラムに何を含める必要があるかを助けてください。挨拶
答え1
Piotrで素早く編集し、$ 3を最後のフィールドである$ NFに置き換えました。
awk '{if ($NF + 0 < 60 || $NF == 69 || $NF == 79 || $NF == 89)print $NF,$0}' file.txt | sort -n | cut -f2- -d' '
$ NFはawkの最後のフィールドであり、最初のフィールドに印刷されるため、ソートユーティリティは数値でソートできます(ソートは昇順であることを覚えておいてください。 ) 全体のライン/レコード/ラインまたは何と呼ばれる$0のために印刷されます。最後の部分は、cutを使用してスペース区切り文字を使用して最初のフィールド/列を切り取ることです。切断に使用される最後のパイプを削除すると、出力が表示されます。このコードは予想ほど強力ではないかもしれませんが、参照として使用できます。私はそれが完璧だと主張しません。
答え2
タイトルに並べ替えが記載されているので、その部分から始めましょう。 GNU/Linux には多数のコアユーティリティ、スペースで区切られたデータを含むファイルを処理できます。だからあなたはできますタイプ-n
3番目の列()に従って数字()で表されます-k 3
。
sort -n -k 3 students_marks
もう一つの素晴らしいツールはAWK。ファイルを1行ずつ読み、いくつかの文を実行します。状況に応じて、以下を使用できます。
awk '{ if ($3 + 0 < 60 || $3 == 69 || $3 == 79 || $3 == 89) print; }' student_marks
コマンドラインから。結果をソートすることはできませんが(または面倒です)、パイプを使用してコマンドの出力を他のコマンドの入力に接続できます|
。
#!/bin/bash
awk '{ if ($3 + 0 < 60 || $3 == 69 || $3 == 79 || $3 == 89) print; }' $1 |
sort -n -k 3
スクリプトを実行すると、最後のスクリプトがコマンドライン$1
で指定した引数に置き換えられます。