2011-06-22 7 views
3

私はそういうヘッダ行を持つ.csvファイルを持っています。csvファイルフィルタリング

headerA,headerB,headerC 
bill,jones,p 
mike,smith,f 
sally,silly,p 

headerC列のf値を持つレコードを除外したいと思います。

sedまたはawkでこれを行うことはできますか?

+2

注特定の入力で間違ったこと。さらに、引用された値は、問題に対する多くの単純なアプローチで問題を引き起こす可能性があります。 – Joey

+1

@ジョイ、右。通常の推奨は[Perl](http://search.cpan.org/~makamaka/Text-CSV-1.21/lib/Text/CSV.pm)などの専用のCSVライブラリで言語を使用することです。 –

答えて

2

だけでなく、あなたがheaderCが3列目に常にあることを知っていれば、以下のsedコマンドでは動作します:

sed -r '/[^,]+(,[^,]+){1},f/ d' <file.csv> filefiltered.csv

そして、次のawkコマンドと同じことを行います。

awk 'BEGIN {FS=","} {if($3 != "f") print}' file.csv

headerCが常に特定の列に含まれていることがわからない場合は、少し難解です。これは機能しますか?

+0

awkコマンド'awk -F、 '$ 3!=" f "' file.csv' –

+0

しかし、ヘッダーに3列目の' f 'しかなければ、ヘッダー行は印刷されません。 –

+1

@glenn it確かに可能です。しかし、-Fがgnuの拡張子であるかどうかを調べることは決して気にならなかったので、私はちょうどもっとも安全なところに行った。私はそうでないことを意味します:) –

-2

SEDやAWK、これはカットとgrepのような、よりシンプルなコマンドで行うことができるための必要はありませんが、私は区切り文字を想定しています。この

cut -d"," -f 3| grep -i f 

のように一緒にパイプ昏睡とC列がthrid 1です。上記の値が適切に変更されない場合。そして、grepをiオプションで使用して、大文字と小文字を無視しました。 lowercse fまたはupppercase fだけをマッチさせたい場合は、iオプションを削除してそれに応じて変更してください。

+1

これは、行全体ではなく、3番目のフィールドからのみ値を出力します。 –

1

少し不明ですが、これはあなたが求めているものですか?

ヘッダで
$ awk -F, '{ if($3 == "f")print}' input 
mike,smith,f 

ヘッダのみf 3列名に含まれていない場合column

$ awk -F, '{ if (NR == 1)print}{if($3 == "f")print}' input | column -t -s, 
headerA headerB headerC 
mike  smith f 
7

を使用してフォーマット:

sed '/,f$/d' FILE 

が何であろうが(入力からすべての行を削除しますそれが,fで終わる場合)。 (デフォルト(-n)から何もなく、1行目の必須1pを印刷し、ラインがf以外の文字で終わっている場合ではないん

sed -n -e '1p;/,[^f]$/p' FILE 

:それは持っている場合

することは、私は一緒に行くと思います。 ... 注:第三columncが1文字以上が含まれている場合、これは、動作しません)

そしてawk 1:

awk -F, 'NF == 1 ; NF > 1 && $3 != "f"' FILE 

(これは常に最初の行を表示します(NF == 1がtrueの場合、デフォルトアクションはprint $0です)。次の条件は、最初の行を越えたかどうかをチェックし、3番目のフィールドがデフォルト動作です。 。)

HTH

+1

3番目の列に> 1の文字が含まれていると、2番目のsedソリューションが壊れます。最初のsedまたはawkをスティックして、より正確に要求を実装するようにしてください( "f"の行を削除してください)。 –

+0

"specification"によると: "headerCカラムのf値を持つレコードをすべて除外したい" 正しいIMOです。 –

+1

3列目に "ab"が含まれていれば、それは '/、[^ f] $ /'と一致しないのでフィルタリングされます。 –

1

grepの作品は、例を見て。

grep ",.*,.*f" << EOF 
headerA,headerB,headerC 
bill,josef,p 
mike,smith,f 
sally,silly,p 
EOF 

出力:[CSV](http://tools.ietf.org/html/rfc4180)埋め込まれた改行を含有することができるので、任意の純粋なラインベースのソリューションが行う可能性があること

mike,smith,f 
+0

ニース、クリーンでクイック(ps。finalは必要ありません。*) –