私はUnixに初めて触れました。自分で学んでいます... ディレクトリ内の複数のファイルから検索して、指定された時間に勤務しているディーラーの名前を抽出する簡単なシェルスクリプトを作成しています。
アイデアは、ファイルの日付(0310など)、ファイルの時間(05など)、またはファイルの時間タイプ(AMまたはPM)を渡して、作業中の特定のディーラーを引き出すことができる必要があることです。それから。
次のスクリプトを使用してデータを抽出できます。
grep -i '05' 0310* | awk -F " " '{print $(01) , $(02) , $(05) , $(06)}' | grep -i am > Dealers_working_during_losses.txt
これにより、午前5時にファイル名0310_Dealer_Analyticにリストされているすべてのディーラーの名前が表示されます。これで、誰でもスクリプトを使用できるように、日付、時刻、時刻の種類をパラメータとして提供できるようにスクリプトを作成する必要があります。進行方法を教えてください。私は初めてミツバチに触れるので、複雑なものよりも論理を理解できるように、簡単なソリューションに感謝します...
以下はサンプルファイルデータです。ルーレットディーラーのデータを抽出するだけです。
Hour AM/PM BlackJack_Dealer_FNAME LAST Roulette_Dealer_FNAME LAST Texas_Hold_EM_dealer_FNAME LAST
12:00:00 AM Izabela Parrish Marlene Mcpherson Madina Britton
01:00:00 AM Billy Jones Saima Mcdermott Summer-Louise Hammond
02:00:00 AM Summer-Louise Hammond Abigale Rich John-James Hayward
03:00:00 AM John-James Hayward Evalyn Howell Chyna Mercado
答え1
まず、既存のスクリプトをクリーンアップします。
1) -i
grep の arg は小文字比較のためのものなので、数字に使うことは意味がありません。だからちょうど削除してください-i
from grep -i '05' 0310*
。
2)" "
はawkのデフォルトFS値なので、指定する必要はありません-F " "
。ただ削除してください。
3)入力フィールド番号は2桁である必要はなく、かっこで囲んで区切る必要もないので、各背は等にすることができます$(01)
。$1
4)awkを使用するとgrepは必要ありません。
grep '05' 0310* |
awk '{print $1, $2, $5, $6}' |
grep -i am > Dealers_working_during_losses.txt
次のように書くことができます:
awk '/05/{$0=$1 OFS $2 OFS $5 OFS $6; if (tolower($0) ~ /am/) print}' 0310* > Dealers_working_during_losses.txt
それでは、既存のエラーを修正してみましょう。
5)/05/
見つける05
どこかにレコード(たとえば、分フィールド)にあるが時間指定があるレコードの先頭でのみ検索したいので、に変更します/^05/
。
6)同様に、grep -i am
完了したとおりにレコードのどこにでも(たとえば、人名など)見つけることtolower($0) ~ /am/
ができますが、am
レコードの2番目のフィールドである場合にのみ探したいので、次のように変更します。tolower($2) == "am"
今、次のコマンドがあります。
awk '/^05/{$0=$1 OFS $2 OFS $5 OFS $6; if (tolower($2) == "am") print}' 0310* > Dealers_working_during_losses.txt
ただし、午前または午後のみテストするので、テストして$2
印刷する前にまったく新しいレコード($ 0)を作成する必要はなく、代わりに次のようにすることができます。
awk '/^05/{if (tolower($2) == "am") print $1, $2, $5, $6}' 0310* > Dealers_working_during_losses.txt
次のようにもっと慣用的に書くことができます。
awk '/^05/ && (tolower($2) == "am") {print $1, $2, $5, $6}' 0310* > Dealers_working_during_losses.txt
次に、すべての値引数を受け入れるシェルスクリプトを作成する方法を紹介します。それは:
#!/usr/bin/env bash
awk -v time="$2" -v ampm="$3" '($0 ~ ("^"time)) && (tolower($2) == tolower(ampm)) {print $1, $2, $5, $6}' "$1"* > Dealers_working_during_losses.txt
上記が実行可能foo
ファイルに保存されていると仮定すると、PATH
次のように呼び出すことができます。
foo 0310 05 am
上記で明確ではない唯一のことは、リテラル値(^05
)をテストして"^"
文字列を変数値に関連付けて生成された文字列に移動するときに、時間比較に別の構文を使用する必要があることtime
です。正規表現のコンテキスト文字列では、次を使用する必要があります。動的正規表現/.../
これは、定数正規表現比較のショートカットが使用できないことを意味するため、その部分も作成する必要があります$0 ~ /.../
。$0 ~