Удалить всю строку, если конкретное слово длиннее X символов, слова в строке, разделенные запятой

#awk #sed #notepad

#awk #sed #notepad

Вопрос:

У меня есть файл .sql с более чем 1000000 строк. Мне нужно удалить строки, содержащие более X символов в третьем «столбце» (столбцы разделены запятой)

Я попытался использовать некоторые VI, SED и AWK. Также Notepad , но ни в одном из них не удалось добиться успеха

 (255500, 0, '0093', 0.4350, 0.4350 ) - Keep this
(255501, 0, '0035521160', 0.4350, 0.4350 ) < - Delete this
 

Слова в третьем столбце, разделенные запятой, которые содержат менее 8 символов, я хочу сохранить строку, те, которые длиннее 8, мне нужно удалить всю строку.

Я попытался удалить вручную, но строк слишком много

Комментарии:

1. Ваш файл действительно выглядит так? Пожалуйста, отредактируйте свой вопрос, чтобы показать, как именно выглядит ваш файл

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

3. Вы упомянули @Raul Chiarella, что вы пробовали несколько вещей, мы всегда призываем людей публиковать свои усилия в своем посте, поэтому, пожалуйста, добавьте их (вместе с ответами на вопросы, заданные в комментариях пользователями) и сообщите нам об этом.

4. awk -F'[ ,] ' '(length($3)-2)<8' filename может быть то, что вы ищете. Но ваш входной файл, похоже, на самом деле не соответствует шаблону. Например, у вас нет разделителей между открывающей скобкой и первым полем, но у вас есть один между последним полем и закрывающей скобкой.

5. Это выглядит как часть инструкции SQL INSERT, поэтому для тех, кто спрашивает: «Да, вероятно, это так и выглядит». Строки будут заключены в одинарные кавычки. Рауль, это должно быть только для строк, которые начинаются со скобок (или любых других правил)? В противном случае, не могли бы вы вставить все это в другую таблицу, а затем отфильтровать? Конечно, это было бы более разумно.

Ответ №1:

Если это не все, что вам нужно, отредактируйте свой вопрос, чтобы уточнить ваши требования и предоставить более репрезентативный образец ввода / вывода:

 $ awk -F, 'length($3)<8' file
(255500, 0, '0093', 0.4350, 0.4350 ) - Keep this
 

Ответ №2:

если ваши данные в файле ‘d’, попробуйте gnu sed:

 sed -E '/^[^,] ,[^,] ,s*[^,]{9,}/d' d
 

добавьте опцию -i, чтобы действительно отредактировать ее; sed -Ei

Ответ №3:

Попробуйте с этим:

Поиск: ^[^,] ,[^,] ,s*'[^']{8,}'.*R?

Заменить на: (nothing)

Это должно работать даже при добавлении пробелов между данными столбца:

 (255501, 0,          '12345678', 0.4350, 0.4350 )
 

У вас есть демо здесь