次のデータを含むテキストファイルを読み取ろうとします。
LNAME FNAME MNAME MAJOR DATE
Smith Jane Chem Date:[somedate]
Doe Joanne Victoria ENG Date:[today]
この例では、[somedate]は今日を除くすべての日付を意味し、[today]は今日の日付を意味します。私の考えは、awkを使用して今日登録されているすべての学生をフィルタリングすることです。日付形式は2022-06-21です。
どんな助けでも大変感謝します。
答え1
grep -v "Date:$(date +%F)\$" < file
Date:
YYYY-MM-DD形式で終わらない現在の日付の行が返されます。
を使用すると、zsh
以下を呼び出すことなくこれを行うことができますdate
。
grep -v Date:${(%):-%D{%F}}$ < file
GNU実装はawk
現在の日付自体を取得することもできます。
gawk 'BEGIN {search = strftime("Date:%F")}
$NF != search' < file
スペースで区切られた最後のフィールドではなく行を返しますDate:[today]
。
に変更:
gawk 'BEGIN {search = strftime("Date:%F")}
NR == 1 || $NF != search' < file
タイトルも印刷できます。
awk
GNU以外のシステムでは、awk
次のことができます。
awk -v search="$(date +Date:%F)" '
NR == 1 || $NF != search' < file
または:
awk 'BEGIN {"date +Date:%F" | getline search}
NR == 1 || $NF != search' < file
(この方法はシェルコードを解釈するために追加のシェル呼び出しを実行しますが、date +Date:%F
この方法はスクリプトでのみ役立ちます#! /usr/bin/awk -f
。)
入力をスペースを区切り文字として使用してcsvの種類に解析できる場合は、csvkitの次のものを使用することもできますcsvgrep
。
<file csvgrep -d ' ' -c DATE -r "$(date +'^Date:%F$')"
ここのシーンで試合がありますDATE
。
ただし、出力はカンマ区切りの値です。パイプを使用すると、区切り文字をカンマではなく空白に戻すことができますcsvformat -D ' '
。
答え2
これは私にとって効果的です。
awk -F'[ :]' -v dt="$(date +'%F')" '$NF != dt' filename
-F'[ :]'
フィールド区切り文字としてスペースまたはコロンを使用するように awk に指示する-v
awkに以下を変数として使用するように指示します。dt="$(date +'%F')"
dt
現在の日付をYYYY-MM-DD形式に設定'$NF != dt'
「最後のフィールドが現在の日付と同じ場合は、この行を無視してください」と言います。
答え3
現在の日付を取得します。コマンドの置き換え そして$ NFを比較してください:
awk -F, -v date="$(date +%F)" '$NF == date' FILE
答え4
通常、AWKの最後のフィールドをフィルタリングするには、$NF == "text"
orを使用してより一般的に作成する必要があります。$NF == value
ここで、valueは適切なコンテンツを持つ変数です。たとえば、$NF
に変更して、すべてのフィールド(列フィルタリング)に適用できます。 ()は、今日登録するすべての学生を(受け入れ)ます。これを拒否するには、同じ論理結果を使用するか、両方を提供できます。$3
3
==
filter in
$NF != value
!($NF == value)
一致させる値は[today]
必要な値にするDate:[today]
ことができます。Date:2022-06-21
変数の内容をvalue
正確に必要なものと同じにすると、このawkコマンドはその値を含む行を「フィルタリング」します。フィールド区切り文字がタブであると仮定します。
awk -v value="Date:[2022-06-21]" '$NF != value' infile
-F","
フィールド区切り文字がコンマの場合は、aを追加します。
今日の日付を取得するには、bash(4.3+)またはksh(93)を使用している場合はシェルを使用できます。
printf -v value 'Date:[%(%F)T]'
awk -v value="$value" '$NF != value' infile
スクリプトの最初の行がヘッダーであり、それを印刷するには、次を追加します。
printf -v value 'Date:[%(%F)T]'
awk -v value="$value" '($NF != value) || (NR==1)' infile
または任意のシェルから:
value="Date:[$(date +'%F')]"
awk -v value="$value" '($NF != value) || (NR==1)' infile
一部のバージョンのawkでは、日付を直接取得できます。
awk 'BEGIN{ value = "Date:[" strftime("%F") "]" } ($NF != value) || (NR == 1)' infile
==
精度が必要な文字列比較を行います。関連テストは、あまり厳格な一致を可能にする正規表現一致~
(またはnegation)です(たとえば、「今年」と一致するために使用できます)。!~
$NF ~ /2022/
2022