固定幅ファイルのフィールド抽出と検証形式 [閉じる]

固定幅ファイルのフィールド抽出と検証形式 [閉じる]

特定のフィールドを抽出してその形式を確認するために、固定幅ファイルの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のメッセージを厳密に一致させるには、両方の比較演算子を両方に置き換えます==

おすすめ記事