私はcsv(カンマ区切りファイル)を持っています。grep のみを使用して ( を使用せずに) 7 番目と 8 番目のフィールドが同じであるパターンを検索する方法を知りたいcut
です。私はこのようなことを試しました:
grep -E '[^,]*,{6,6}' input.csv | grep '\(.*\)\(,\)\(\1$\)' | less
残念ながら、これは何も印刷しません。必要な出力を取得するにはどうすればよいですか?
カンマが含まれるフィールドのように厄介なものがなく(最初の8つのフィールドにそのようなフィールドがある場合、完全なCSV認識ツールがないとファイルを処理できないため)、9番目のフィールド(つまり7番目のフィールド)があると仮定します。 8番目のフィールドの後には両方ともコンマが続きます)then:
grep '^\([^,]*,\)\{6\}\([^,]*,\)\2' file.csv
最初のビットは、ゼロ以上の非コンマの6つのシーケンスを示し、それぞれにコンマが続きます。次に、末尾にコンマが付いた7番目(おそらく空)のフィールドがあります。その後に同じものが続きます(\2
)。
$ cat file.csv
a,b,c,d,e,f,g,g,i
a,b,c,d,e,f,g,h,i
a,b,c,d,e,f,hhh,hhh,i
,b,c,d,e,f,hhh,hhh,i
,,c,d,e,f,hhh,hhh,i
,,,d,e,f,hhh,hhh,i
,,,,e,f,hhh,hhh,i
,,,,,f,hhh,hhh,i
,,,,,,hhh,hhh,i
,,,,,,hhh,hhh,
$ grep '^\([^,]*,\)\{6\}\([^,]*,\)\2' file.csv
a,b,c,d,e,f,g,g,i
a,b,c,d,e,f,hhh,hhh,i
,b,c,d,e,f,hhh,hhh,i
,,c,d,e,f,hhh,hhh,i
,,,d,e,f,hhh,hhh,i
,,,,e,f,hhh,hhh,i
,,,,,f,hhh,hhh,i
,,,,,,hhh,hhh,i
,,,,,,hhh,hhh,
$
g,h,i
この行は出力に表示されないことに注意してください(表示されるべきではありません)。残りは表示されるべきであり、実際に表示されます。
これはすべて、POSIX基本正規表現またはBREを使用して行われます。egrep
またはを使用する場合grep -E
は、拡張正規表現またはEREを自由に使用でき、\2
;を除くすべての円記号を省略できます。また、8フィールドの行と9行以上の行があるファイルを処理することもできますが、それは通常のCSVファイルではありません。BREバージョンは、正確に8列のCSVファイルで機能するように変更することもできます。
grep '^\([^,]*,\)\{6\}\([^,]*\),\2$' file.csv
正規表現を使用する技術の一部は、特定の結果を達成するためのさまざまな方法について柔軟な考え方を持つことです。多くの場合、それを行うには複数の方法があります。
awk に興味がある場合は、もっと簡単です。
awk -F, '$7==$8' your_file
またはperlで:
perl -F, -ane 'if($F[6]==$F[7]){print}' your_file