2012-04-12 16 views
1

2番目の列に4文字以上含まれているCSVファイルの行をすべて削除するにはどうすればよいですか?例:CSVファイルの2番目の列に4つ以上の文字を含む行をすべて削除するにはどうすればよいですか?

cave,ape,1 
tree,monkey,2 

2行目に2文字目が3文字以上含まれているため、削除されます。

+0

データはユニコードですか? – pizza

+0

はい、データはUnicodeです。それは様々な言語のシンボルを持っています。 – Village

+0

これらのユーティリティのほとんどがunicode(grep、sed。....など)をサポートしていないので、あなたの要件に指定する必要があります。それらはシングルバイト文字セットのみを実行します。 – pizza

答えて

8
awk -F, 'length($2)<=3' input.txt 
+0

これをテストし、エスケープされたコンマを処理します。 :) – Peter

2

あなたは、このコマンドを使用することができます:

-v = remove lines matching 
-E = extended regular expression syntax (also -P is perl syntax) 

bashのもの:正規表現構文の

> filename = overwrite/create a file and fill it with the standard out 

内訳:

grepの構文の

grep -vE "^[^,]+,[^,]{4,}," test.csv > filtered.csv 

内訳

"^[^,]+,[^,]{4,}," 

^ = beginning of line 
[^,] = anything except commas 
[^,]+ = 1 or more of anything except commas 
, = comma 
[^,]{4,} = 4 or more of anything except commas 

また、最初の2つの列にデータにコンマが含まれていると、上記は単純化され、機能しないことに注意してください。 (それがエスケープコンマと生のものとの違いを知らない)

+0

+1ですが、最初のフィールドが空の場合は正しく動作しません。 – Sorpigal

1

誰もが、まだsed答えを与えていないので、ここにある:

sed -e '/^[^,]*,[^,]\{4\}/d' animal.csv 

そして、ここではいくつかのテストデータです。テストへ

>animal.csv cat <<'.'  
cave,ape,0 
,cat,1 
,orangutan,2 
large,wolf,3 
,dog,4,happy 
tree,monkey,5,sad 
. 

そして今:

sed -i'' -e '/^[^,]*,[^,]\{4\}/d' animal.csv 
cat animal.csv 

のみ猿、猫と犬が出力に表示されます。

+1

これはテストデータでは機能しますが、一般的な質問では機能しません。おそらく 'sed -e '/^[^、] *、[^、] \ {4 \}/d''はもう少し弾丸になりそうですか? – potong

+0

はい、あなたはそれについて正しいです。私は先に進んで編集します。 – Sorpigal

2

これは、お客様のデータタイプのフィルタスクリプトです。あなたのデータはutf8であるとみなします

#!/bin/bash 
function px { 
local a="[email protected]" 
local i=0 
while [ $i -lt ${#a} ] 
    do 
    printf \\x${a:$i:2} 
    i=$(($i+2)) 
    done 
} 
(iconv -f UTF8 -t UTF16 | od -x | cut -b 9- | xargs -n 1) | 
if read utf16header 
then 
px $utf16header 
cnt=0 
out='' 
st=0 
while read line 
    do 
    if [ "$st" -eq 1 ] ; then 
    cnt=$(($cnt+1)) 
    fi 
    if [ "$line" == "002c" ] ; then 
    st=$(($st+1)) 
    fi 
    if [ "$line" == "000a" ] 
    then 
    out=$out$line 
    if [[ $cnt -le 3+1 ]] ; then 
     px $out 
    fi 
    cnt=0 
    out='' 
    st=0 
    else 
    out=$out$line 
    fi 
    done 
fi | iconv -f UTF16 -t UTF8 
関連する問題