如何从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

我该如何使用csvgrepor awkorsed命令来实现此目的? 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应该是安全的。01234567890-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

如果在行内至少找到一个字符,则避免打印。

相关内容