我想从 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
or awk
orsed
命令来实现此目的? CSV 文件有两列。它应该省略其中包含任何字母的行。
答案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 个或多个 1 个或多个十进制数字的序列的单独列表,使用 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
如果至少找到一个字符,则删除所有行。
和awk
:
awk '!/[a-zA-Z]/' data
如果在行内至少找到一个字符,则避免打印。