数字のみを含む CSV ファイルから行を取得したいです。入力ファイルは次のようになります。
8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,
、などの上記の形式の数字を取得できるはずです9
。9.0.0
8.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
置き換えても安全です。0123456789
0-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 文字が見つかった場合は印刷を回避します。