Удалить строки, не соответствующие требуемому формату в CSV-файле

Для тех, у кого возникла такая же проблема... спустя долгое время я смог ее решить.

Я устал пробовать разные вещи, поэтому я удалил как авторизованные ключи _, так и известные _хосты, все, что у меня было, это пустой каталог.ssh. В тот момент я отключился от сервера и думал, что сломал все это, но, поскольку я на Mac, сделав это https://coderwall.com/p/8ag5aq/ssh-broken-pipe-fix-mac-os-x, я смог снова подключиться.

Я просто снова выполняю команду ssh -copy -id с Mac, и она автоматически создает на сервере файл «авторизованные _ключи», но не «известные _хосты».

Только после этого я запустил ssh -i /path/to/MYKEY user@serverIP, и он работал как шарм без запроса пароля.

3
21.11.2020, 05:31
3 ответа

Любого из них должно быть достаточно для соответствия простым/базовым форматам (, например. без знаков, без показателей )числаINT,FLOAT,FLOAT,CHAR:

grep -E '^[0-9]+,([0-9]+\.[0-9]+,){2}[[:alpha:]]$' file

sed -En '/^[0-9]+,([0-9]+\.[0-9]+,){2}[[:alpha:]]$/p' file

awk '/^[0-9]+,([0-9]+\.[0-9]+,){2}[[:alpha:]]$/' file
3
18.03.2021, 22:54
# expect
#          1         2
# 123456789012345678901234567
# 160314591xxxx,48.12,0.0xx,s

grep -Ex '160314591[0-9]{4},48\.12,0\.0[0-9]{2},s' < file.csv

Выполнит строгое сопоставление. Вы можете сделать более или менее строгим то, что именно вы хотите, чтобы оно соответствовало, настроив это регулярное выражение.

1
18.03.2021, 22:54

Is there a way to find and remove lines that do not fit the format?

Много способов, вот один:

$ perl -n -i.bak -e 'print if /\d{13},\d\d.\d\d,\d\.\d\d\d,s$/' t.dat

$ diff t.dat.bak t.dat
7d6
< 1603145914502,48.12,0.085,s915899,48.12,0.019,s
13d11
< 1459143

$ cat t.dat
1603145914502,48.12,0.085,s
1603145914815,48.12,0.020,s
1603145914941,48.12,0.019,s
1603145915404,48.12,0.031,s
1603145915612,48.12,0.033,s
1603145915899,48.12,0.019,s
1603145914815,48.12,0.020,s
1603145914941,48.12,0.019,s
1603145915404,48.12,0.031,s
1603145915612,48.12,0.033,s
1603145915899,48.12,0.019,s
1603145914815,48.12,0.020,s
1603145914941,48.12,0.019,s
1603145915404,48.12,0.031,s
$

Я склоняюсь к perl до awk/sed, но та же самая операция может быть выполнена с помощью awk почти таким же образом


I would really appreciate if the command could be explained as well so I can learn something from it.

Пояснение

  • -nперебирать строки из файла, но не выводить их в STDOUT
  • -iотредактируйте файл в -месте
  • -i.bakи сохранить резервную копию с указанным расширением имени файла на случай, если я совершу ошибку!
  • -e 'script'запускать команды в скрипте (для каждой строки ввода, начиная с -n опции)
  • print if...вывести строку, если она соответствует условному выражению
  • /... /-используйте это регулярное выражение для сопоставления с шаблоном -
  • ^в начале строки...
  • \dсоответствует цифре
  • {3}соответствует ровно трем ранее указанным символам
  • ,соответствует буквальному символу запятой
  • \.соответствует буквальному символу остановки (в противном случае .является подстановочным метасимволом)
  • sсоответствует буквальному символу s
  • $соответствует концу строки (, т. е. в строке не должно быть других символов.

Более гибким выражением было бы `^\d+,\d+.\d+,\d+.\d+,[a -zA -Z]$

  • +хотя бы один из предыдущих символов
  • [...]один из указанного набора
  • [a-z]любой символ ASCII нижнего регистра от a до z включительно
  • [[:alpha:]]любой символ из алфавитного набора POSIX
  • \p{Lowercase_Letter}любой символ Unicode со свойством строчная буква

Регулярные выражения Perl немного отличаются от регулярных выражений, используемых в awk/grep. Я думаю, что в современных версиях awk/grep есть возможность использовать регулярные выражения в стиле perl.См. справочную страницу для параметра grep -P

.
2
18.03.2021, 22:54

Теги

Похожие вопросы