Как получить строки из CSV-файла, содержащие только числовые значения (без английских букв)?

Как получить строки из CSV-файла, содержащие только числовые значения (без английских букв)?

Я хочу получить строки из 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и т. д.

Как мне использовать команду csvgrepor awkили sedдля этого? Файл 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

Избегайте печати, если внутри строки обнаружен хотя бы один символ.

Связанный контент