このテキストファイルには、ベストセラーの曲が含まれています。その構造は次のとおりです。
Single,Artist,Record label,Released,Chart,Traditional sales peak,
いくつかの例示的な行は次のとおりです。
Imagine,John Lennon,Apple,Oct-75,1,1714351
Uptown Funk,Mark Ronson featuring Bruno Mars,RCA,Dec-14,1,1647310
Wonderwall,Oasis,Creation,Oct-95,2,1502270
1位(5番目のフィールド)に含まれていない曲を探そうとしますWonderwall
。つまり、5番目のフィールドをどのように指定するのかわかりません。私の考えはcat top50.txt | grep-vE "^[^*,*,*,*,[1],]"
。
私も200万売り上げの曲を探したい
grep
しかし、特定の地域をターゲットにする方法を理解するまでは、そうすることはできません。
答え1
Grepは間違ったツールです。フィールドを処理するように特別に設計されたツールを使用する必要があります。たとえば、awk
5番目のフィールドが1より大きいすべての行を取得するには:
$ awk -F, '$5 > 1' file
Wonderwall,Oasis,Creation,Oct-95,2,1502270
または、6番目のフィールドは200万以上です。
awk -F, '$6 >= 2000000' file
grep
値を比較できないため、このようなことはできません。あなたができる最善の方法は、このような恐ろしいハッキングを行い、次の行を1
5番目のフィールドにすることです。
$ grep -E '([^,]+,){4}1,' file
Imagine,John Lennon,Apple,Oct-75,1,1714351
Uptown Funk,Mark Ronson featuring Bruno Mars,RCA,Dec-14,1,1647310
そして、数値1以外のものを得るには、一致を逆にします。
$ grep -vE '([^,]+,){4}1,' file
Wonderwall,Oasis,Creation,Oct-95,2,1502270
これは、「1つ以上のnot ,
([^,]+
)とコンマ、a1
とコンマが正確に4回繰り返されることを見つける」ことを意味します。
あなたがやろうとしているのは、まったく異なるものを見つけることです。正規表現の[ ]
文字クラスを表します。したがって、[abc]
「a
、またはb
、またはいずれかc
」を意味し、[^abc]
「いずれか」を意味します。何もないa
、、b
または除外c
。したがって、a、a、a、a、またはa以外の文字と同じで、[^*,*,*,*,[1],]
すべての文字と一致します。私はあなたが次のことをしようとしていると思います。[^*,[]1]
[
]
1
,
*
$ grep -vE '^.*?,.*?,.*?,.*?,1,' file
Wonderwall,Oasis,Creation,Oct-95,2,1502270
Theは、*
「最初の0個以上」を意味する修飾子です。したがって、それ自体には何の意味もありません。任意の文字を0回以上一致させるには、.*
not aloneを使用できます*
。次に、単一文字は.*
行末まで一致します。これを「貪欲なマッチング」といいます。貪欲ではない場合、最長の一致ではなく可能な限り短い一致を見つけるには、上記で使用した理由が?
必要です。.*?