Я хочу получить строки из 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
или 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
Избегайте печати, если внутри строки обнаружен хотя бы один символ.