grepを使用して構造化テキストファイルから情報を見つける方法

grepを使用して構造化テキストファイルから情報を見つける方法

このテキストファイルには、ベストセラーの曲が含まれています。その構造は次のとおりです。

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は間違ったツールです。フィールドを処理するように特別に設計されたツールを使用する必要があります。たとえば、awk5番目のフィールドが1より大きいすべての行を取得するには:

$ awk -F, '$5 > 1' file
Wonderwall,Oasis,Creation,Oct-95,2,1502270

または、6番目のフィールドは200万以上です。

awk -F, '$6 >= 2000000' file

grep値を比較できないため、このようなことはできません。あなたができる最善の方法は、このような恐ろしいハッキングを行い、次の行を15番目のフィールドにすることです。

$ 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を使用できます*。次に、単一文字は.*行末まで一致します。これを「貪欲なマッチング」といいます。貪欲ではない場合、最長の一致ではなく可能な限り短い一致を見つけるには、上記で使用した理由が?必要です。.*?

おすすめ記事