csvファイルから数値(英字なし)のみの行を取得する方法は?

csvファイルから数値(英字なし)のみの行を取得する方法は?

CSVファイルから数字のみを含む行をインポートしたいと思います。私の入力ファイルは次のとおりです。

8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,

9上記の形式(など)で数字を取得できるはずです。9.0.08.1

これを達成するためにorコマンドcsvgrepをどのように使用できますか? CSVファイルには2つの列があります。文字を含む行は省略する必要があります。awksed

答え1

すべてのフィールドに有効な数字が含まれていることを確認し、空のawkフィールドをスキップします。

awk -F, '{ for(i=1; i<=NF; i++) if($i+0!=$i && $i!="") next }1' infile

答え2

grep次のようにコマンドを使用できます。

grep -v "[A-Za-z]" filename > filename.output

テストは次のとおりです。

# cat zz2
1;2
a,1
2,B
                                                                                                                   
# grep -v "[A-Za-z]" zz2
1;2

空行をフィルタリングするには、次を使用できます。

grep -v "[A-Za-z]" zz2 | grep -v '^$'

答え3

LC_ALL=C grep -v '[^0123456789,.]' < in.csv > out.csv

以外の文字を含む行は削除されます0123456789,.。を使用して、LC_ALL=Cすべてのバイトシーケンスが有効な文字を形成していることを確認します。対応するロケール(通常は他のロケールではない)では、Cに置き換えるのが安全です。01234567890-9

,行がゼロ以上の区切られたフィールドシーケンスでなければならないより厳密な一致の場合は、.GNUを使用して1つ以上の10進数からなるゼロ以上のシーケンスからなる別々のリストが含まれていますgrep

LC_ALL=C grep -xP '((\d+(\.\d+)*)?)(,(?1))*' < in.csv > out.csv

またはPOSIX:

number=[0123456789]+
field="($number(\\.$number)*)?"
LC_ALL=C grep -xE "$field(,$field)*" < in.csv > out.csv

答え4

そしてsedコマンドd

sed '/[a-zA-Z]/d' data 

1 つ以上の文字が見つかると、すべての行が削除されます。

そしてawk

awk '!/[a-zA-Z]/' data

行の中に1つの文字がある場合は印刷しないでください。

関連情報