タブで区切られた値を見つけるために「\ t」を使用すると、どのような問題がありますか?

タブで区切られた値を見つけるために「\ t」を使用すると、どのような問題がありますか?

4つの値(タブで区切られた値)を含む.tsvファイルがあります。したがって、1行につき3つのタブのみが必要で、各タブの周囲には次のテキストが必要です。

value   value2  value3  value4

しかし、一部の行が壊れているようです(3つ以上のタブがあります)。この行を見つける必要があります。


私は次のgrepパターンを思いついた。

grep -v "^[^\t]+\t[^\t]+\t[^\t]+\t[^\t]+$"

私の考え:

  • 最初の^は始めと一致します。
  • [^\t]+ は複数の「タブなし」と一致します。
  • \ tは単一のタブ文字と一致します。
  • $ 試合終了

次に、正しい順序で正しい回数だけ入れます。これは正しい行と一致する必要があります。だから私は-vオプションを使って復元して間違った行を得ました。

ただし、-vオプションを使用すると、ファイル内のすべての行とタブなしで試したランダムなテキストと一致します。

私の間違いは何ですか?

編集:私はDebianとbashを使っています。

ベストアンサー1

ご覧のとおり、\t基本正規表現には特別なものはなく、grep基本的にBREが使用されています。grepLinuxでは、デフォルトで-PPerl準拠の正規表現を持つGNUを使用すると、\tタブ文字を使用できます。

しかし、欲しいものを達成するのははるかに簡単ですawk。入力フィールド区切り文字をタブ(-F '\t')に設定し、NFフィールド数()が3以外の行を印刷するだけです。

awk -F'\t' 'NF!=3' file

fileこれにより、3つ以上のフィールドを含むすべての行が印刷されます。 3つ以上のフィールドに制限するには、次のようにします。

awk -F'\t' 'NF>3' file

おすすめ記事