まずはまだ初心者なので学んでいます。
データセットファイルは次のとおりです。
101 80 10 27598 General Tao Vancouver 01:45:10 01:46:10 00:43:00 00:59:59 01:25:10
私は時間がフォーマットと一致することを確認しようとしていますが、/d/d:/d/d:/d/d
その正規表現と一致しない場合は行の最初の数字(この場合は101)を印刷します。
私はCLIでライナーを試しましたが、成功しませんでした。
grep '/d/d:/d/d:/d/d' file.txt
その時も何も起こらなかった
edit1:データセットに01:4510または同様のデータがあります。
私が取得したいサンプル出力は次のとおりです。
104 80 10 27598 BigBelly Vancouver 01:4510 01:46:10 00:43:00 00:59:59 01:25:10
答え1
10進数を一致させる\d
ために正規表現演算子を使用することを考えてみました。perl
ただし、grep
これをサポートする実装はほとんどありません。標準同等物はです[[:digit:]]
。
一部のgrep
実装\d
はオプションの渡しをサポートしています-P
(デフォルトの正規表現ではなくPerlと同様の正規表現を使用)。
したがって、これを使用して次のことができます。
grep -Pv '\d\d:\d\d:\d\d' < file.txt
このパターンに一致する文字列を含まない行を返します。
(参考にしてください。バックスラッシュいいえスラッシュ)
または:
grep -Pv '(\s+\d\d:\d\d:\d\d){5}\s*$' < file.txt
5つのタイムスタンプで終わらない行の場合。
この場合、最初のフィールドを返すには、次のことができます(サポートされているgrep
実装を使用-o
)。
grep -Po '^(?!.*(\s+\d\d:\d\d:\d\d){5}\s*$)\s*\K\S+' < file.txt
今回はgrep
'を使用するのではなく、負の予測Perl正規表現演算子を使用します-v
。
macOS grep
(使用中と言われましたが、今は削除しました)オペレーティングシステム質問にタグを付けて次に置き換えます。アップルシステム)は、基本正規表現でサポートされている数少ない正規表現の1つですが、そうで\d
ないため、対応-P
する演算子(?!...)
と\K
演算子は使用できません。
標準(およびクリーナー)に対応するものは次のとおりです。
awk '!/([[:digit:]]{2}:){2}[[:digit:]]{2}/ {print $1}' < file.txt
awk
使用拡張正規表現これは別の方言です。インターバル演算子や文字クラスを含む一部の実装ではmawk
まだサポートされていません。{2}
では、mawk
次の操作を行います。
awk '!/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ {print $1}' < file.txt
これは他の実装でも機能しますawk
が、一部の実装では[0-9]
0123456789以外の文字と一致する可能性があります(ASCII文字ではないため、入力に問題がない可能性があります)。
または、最後の5つのフィールドがパターンと一致していることを再確認してください。
awk '
{
for (i = 0; i < 5; i++)
if (!($(NF-i) ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/)) {
print $1
next
}
}' < file.txt