2011-06-24 6 views
0

...、fxx = sth、...という形式のタグを持つcsvファイルを持っていて、各フィールドでどのフィールド値を取ることができるかを確認したいと思います。現在、私は次のものを使用しています:ファイル内にパターンの出現が見つかりました

cat data.csv | grep "f10=" | sed 's/.*\(f10=[^,]*\).*/\1/g' | sort | uniq 

しかし、これは私にすべての行の最後の一致を与えます。もし行に...,f10=a,...,f10=b,...があれば、私は常に2番目のマッチを得るだけです。

良い方法がありますか?

+1

あなたは、CSVの小さなサンプル/スニペットを投稿できますか? – matchew

+0

おそらくそれは起こっているのでしょう...それ以外の 'Fxx = sth'は最後の' f10 = 'と置き換えられています。ですから、行を '、'で区切り、f10 =部分のみを取得するのが最適です。 – Rahul

答えて

1

私が正しく理解していれば、それは,分離csvファイルですので、あなたが必要な場合がありますことは次のとおりです。

tr "," "\n" FILE | sed -n '/^f[0-9]\+=/p' | sort | uniq -c 

trが新しい行に区切り文字を変換し、sedfXX=部品なしで行をフィルタリングし、それを並べ替えます、distincted。

HTH

+0

ありがとう、trは素晴らしいヒントです – Cookie

1

行はコンマで終わる場合、

sed -e 's/,f10=/,X=/g' -e 's/f[0-9]*=[^,]*,*//g' -e 's/X=/f10=/' data.csv 

は、(それがはカンマで終了しない場合は、よく、ちょうど端に-e 's/,$//'タック。)

+0

ありがとうございます! – Cookie

1

あなたが許可されている場合代わりのsedのPerlを使用する:

ここ
grep f10= data.csv | perl -e 'for(<>){ @f=/f10=[^,]+/g; print "@f\n" }' | 
sort | uniq 

はperlスクリプトが何をするかです:

STDINから得られた線を介しての
  • for(<>)ループ
  • @f=/f10=[^,]+/gマッチあなたの正規表現、/f10=[^,]+/、格納@fアレイ
  • print "@f\n"内のすべてのオカレンススペースと改行で区切られた文字列として@f配列の内容を印刷
+0

ありがとうございます! – Cookie

関連する問題