数値のみ(英語の文字なし)の行を CSV ファイルから取得するにはどうすればよいでしょうか?

数値のみ(英語の文字なし)の行を CSV ファイルから取得するにはどうすればよいでしょうか?

数字のみを含む CSV ファイルから行を取得したいです。入力ファイルは次のようになります。

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

、などの上記の形式の数字を取得できるはずです99.0.08.1

csvgrepこれにはまたはコマンドをawkどのように使用すればよいですかsed? CSV ファイルには 2 つの列があります。文字が含まれる行は省略する必要があります。

答え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

より厳密なマッチングでは、行が 0 個以上の,区切られたフィールドのシーケンスであり、その.フィールドが 0 個以上の 10 進数のシーケンスの区切られたリストで構成されることを要求するため、GNU では次のように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 文字が見つかった場合は印刷を回避します。

関連情報