awk
正規表現の助けやアドバイスが必要です。不規則に構造化されたデータ入力ファイルがあります。このファイルを正しく解析するには、次の形式の行を識別する必要があります。
@ 8/1/17, 10:04 PM
このパターンを含む行は、トランザクション全体の終わりを示します。スペースと文字の前に日付とタイムスタンプが必要です@
。
私は「ほとんどの」使用法と一致すると思われる正規表現を一緒にまとめました。
\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M
ただし、次の文で使用すると一致しないようですawk
。
$ awk 'match($0, /\W\@\W[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}\,\W[0-9]{1,2}\:[0-9]{2}\W[AP]M/) {print $0}' testfile2.txt
私のシステム(モハビマコース)には以前のバージョンがありますawk
awk version 20070501
。
私も以下を見つけました:
grep -e
testfile2.txt
このパターンを任意の行と一致させることはできませんでしたが、一致すると予想した行と一致しましたegrep
。grep -E
awk 'match($0, /\@/) {print $0}' testfile2.txt
予想される行と一致(および印刷)しますが、単一の文字に依存することはできません!
これはtestfile2.txtです:
+13054261988: データをプライマリリポジトリに渡す
@ 1/7/18, 4:21
+16744774911: 次の URL を使用してください:https://www.repo-prime.ga/
@1/7/18、午後4時22分
+13054261988:はい。パスワードは大丈夫ですか?
@ 1/7/18、6:12 PM
+16744774911:いいえ、すべての取引に2FAを使用します
@ 1/7/18、8:56 PM
+13054261988:Google OTPを使用しますか?その場合は、より多くの情報が必要です。
@ 1/7/18、午後9時36分
+13054261988:できるだけ早く返信してください。アップロードする必要がある取引があります。
2018年1月7日午後9時46分
awk
ステートメントに表示されないエラーのため、正規表現が使用中に一致しませんかawk
?それとも正規表現自体、2つの組み合わせなどが原因ですか?
答え1
{…}
非常に古いawkバージョンにはその機能がないようです。
この以前の正規表現構文は、すべてのawkで一致する必要があります。
awk '/@ [0-9][0-9]?\/[0-9][0-9]?\/[0-9][0-9]?, [1-2]?[0-9]:[0-6][0-9] [AP]M/' file
awkが次のような角括弧式と一致する場合は、正規表現を[[:blank:]]
より柔軟にすることができます。
awk '/@[[:blank:]][0-9][0-9]?\/[0-9][0-9]?\/[0-9][0-9]?,[[:blank:]][1-2]?[0-9]:[0-6][0-9][[:blank:]][AP]M/' file
1つ以上の数字を一致させることで十分であれば(なぜそれをすべきかわからない)、より短い正規表現を使用できます。
awk '/@ [0-9]+\/[0-9]+\/[0-9]+, [1-2]?[0-9]:[0-6][0-9] [AP]M/' file
必要に応じて start^
と end を追加して正規$
表現をさらに制限することができます。
私はmatch
このように単純な行一致を使用しませんが、同じ正規表現はこの関数と完全に機能します。
答え2
- 以前になぜ厳密な一致
/\W
(単語以外の文字)を使用するのですか@
?テキストファイル@
が行の先頭にあるかのように \@
、、\,
で文字をエスケープする必要はありません。:
(特殊文字ではありません。)match()
パターンのみが一致すると、通話は重複します。
$ awk '/^@ [0-9]{1,2}\/[0-9]{1,2}\/[0-9]{1,2}, [0-9]{1,2}:[0-9]{2} [AP]M/' file
@ 1/7/18, 4:21 PM
@ 1/7/18, 4:22 PM
@ 1/7/18, 6:12 PM
@ 1/7/18, 8:56 PM
@ 1/7/18, 9:36 PM
@ 1/7/18, 9:46 PM