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
これを達成するためにorコマンドcsvgrep
をどのように使用できますか? CSVファイルには2つの列があります。文字を含む行は省略する必要があります。awk
sed
答え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
,
行がゼロ以上の区切られたフィールドシーケンスでなければならないより厳密な一致の場合は、.
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つの文字がある場合は印刷しないでください。