как спросить у кота (и, может быть, grep ? )не учитывать новую строку, если она заключена в двойные кавычки?

У меня недостаточно репутации, чтобы комментировать, но:

  • Как упоминалось в комментариях, установка параметра монтирования noatime является хорошей идеей для ограничения записи на USB-накопитель.
  • Хранение SWAP на одном из жестких дисков или твердотельных накопителей NAS (, даже если вам нужна подкачка ), продлит срок службы и, безусловно, предотвратит невыносимо медленную работу, которая была бы при доступе с флэш-накопителя USB.
  • Обеспечение того, чтобы USB-накопитель не был заполнен до краев, позволит выравнивать износ контроллера флэш-памяти, чтобы предотвратить прожигание отдельных секторов намного раньше, чем других.

Вся твердотельная память имеет конечный срок службы циклов записи и технически изнашивается через них в конце концов, но, честно говоря, забота об этих двух вещах даст вам полезный срок службы порядка десятилетий, если вы не часто используете другое место для дополнительного хранения. Если это в первую очередь просто чтение ОС для загрузки и случайных обновлений, у вас не должно быть никаких проблем.

4
23.09.2020, 16:04
2 ответа
awk '/^01/||n%2{print;n+=gsub(/"/,"&")}' file

Для каждой строки

  • /^01/||n%2Если строка начинается с 01илиn(изначально ноль )нечетный,
    • printРаспечатать
    • n+=gsub(/"/,"&")увеличить nна значение, возвращаемое функцией gsub.
      Это заменяет каждую двойную кавычку -/"/самой собой "&". Это действительно было бы бессмысленно, но он также возвращает количество сделанных замен, так что это способ подсчета количества двойных -кавычек в строке.

Обратите внимание, что если nнечетное (n%2), строка не имеет закрывающей двойной -кавычки, поэтому она продолжает печатать до тех пор, пока nне станет четным, независимо от того, есть ли совпадение /^01/на следующие строки.

Боковой -по -боковой дифференциал для вас:

$ diff -yW 30 <(cat file) <(awk '/^01/||n%2{print;n+=gsub(/"/,"&")}' file)
04,xde        <
01,abc"         01,abc"
cd              cd
as"             as"
02,dsad       <
03,1ad"       <
01,as,"as       01,as,"as
us"             us"
02,s          <
01,a            01,a
10
18.03.2021, 23:03

Использование csvgrepиз пакетаcsvkitдля извлечения всех записей со значением codeRegion, содержащим строку01:

csvgrep -c codeRegion -m 01 file.csv

Здесь используется правильный синтаксический анализатор CSV, поэтому не будет проблем с символами новой строки или запятыми в полях с правильными кавычками.

Опция -cвыбирает столбец, который мы хотим исследовать, по номеру или имени, а -mуказывает строку для сопоставления. Можно также использовать -rдля сопоставления с регулярным выражением, например. -r '^01$', чтобы избежать сопоставления строк, где 01является подстрокой (, как в011). См. csvgrep --help.

14
18.03.2021, 23:03

Теги

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