特定のフィールドを抽出してその形式を確認するために、固定幅ファイルのpocを作成しています。しかし、どちらも私に確認の失敗を与えました。この点を指摘するのに役立ちますか?
コードからEメールIDを引いてスペースを切り取り、フォーマットを確認したいと思います。
パスワード
awk -v m=16 -v p=13 -v 'n=[a-z][email protected]' '
{
c=substr($0,m,p)
sub(" +$", "", c)
c !~ "^" n "$"
printf "%s:%s:%s\n", FILENAME, FNR, $0> "/dev/stderr"
count++
}
END {print count}' BNC_fixedwidth.txt
入力ファイル
10027 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
答え1
これはどうですか?
awk -v startPos=16 -v len=13 -v pat='[[:blank:]][a-z]+@gmail\\.com[[:blank:]]' '
{ match($0, pat);
if (RSTART+1>=startPos && RLENGTH-2<=len){ print; "or do whatever you want..." }
}' infile
[[:blank:]]
エッジの単一のスペース/タブに一致するように、メール正規表現の先頭と末尾に追加しました。pat
したがって、[[:blank:]]
関数と一致すると、startPosが15に設定され、lenが15に設定されます(長さに2つの追加文字があるため、最初の文字が最後になります)match()
。一致するものが見つかると、awkはRSTARTとRLENGTH変数を設定すると、RSTARTに1を加えてstartPosの場合は16になり、RLEGNTHから2を減算してlenチェックの場合は13になることがわかります。
入力する:
11111 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
22222 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
33333 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
44444 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
55555 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
66666 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
77777 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
88888 20033t @gmail.com 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
出力:
11111 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
33333 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
77777 20033t [email protected] 19519 11/18/2021 12:06:10.260 PM BNC HardB 5 User Unk 125
場所16から始まり、長さ13のメッセージを厳密に一致させるには、両方の比較演算子を両方に置き換えます==
。