Как найти строки, у которых определенный символ меньше определенного числа? - PullRequest
2 голосов
/ 06 июня 2011

Я пытаюсь написать команду shell / perl, которая выдаст мне номера строк, число полей которых меньше определенного числа.Например, у меня есть текстовый файл с разделителями-запятыми.Я пытаюсь найти те строки, в которых меньше, скажем, 15 полей.Так что я думаю, что проблема сводится к возвращению строк, у которых меньше 14 запятых.

Может кто-нибудь помочь мне с этим?

Ответы [ 3 ]

5 голосов
/ 06 июня 2011

Вы можете легко сделать это в bash, вызвав awk. Этот вид сценария - именно то, для чего был разработан awk.

awk -F, '{ if (NF < 15 ) print NR "," $0 }' fileToTest

-F, указывает awk разбивать каждую строку на запятой, а AND NF (Number_of_Fields) указывает, сколько полей было разбито в каждой строке. Измените значение 15 по мере необходимости, чтобы помочь вам проверить ваши файлы.

Не забывайте, что файлы CSV могут иметь запятые, встроенные в поля, если поле окружено кавычками, т.е.

 fld1, "text for, fld2", fld3, fld4,....

Решить эту проблему значительно сложнее. Используйте символ табуляции для разделения полей (или какого-либо другого персонажа, который, как вы можете быть уверены, никогда не появится в ваших данных), а затем выспитесь ночью; -)

Надеюсь, это поможет.

4 голосов
/ 06 июня 2011

Симпатичная версия

perl -lne 'print if tr/,// < 14

tr/x// - идиома Perl для подсчета количества x es в строке.

Более гибкая версия

perl -F, -lane 'print if @F < 15`

-a включает «режим автоматического разделения», -F устанавливает разделитель на запятую, а код в -e говорит о необходимости печати, если имеется менее 15 полей.Это хорошо, если вы в конце концов захотите сделать что-то еще с содержимым полей, поскольку они доступны в @F, уже разделенном запятой.

Правильно CSV версия

Несделайте хорошую строчку, но вы можете использовать Text :: xSV или Text :: CSV_XS , если ваши данные действительно CSV, а не просто "разделены запятыми" - разницачто CSV может содержать встроенные запятые, символы новой строки и другие странные вещи, используя поля в кавычках.

2 голосов
/ 06 июня 2011

Вы также просили Perl. Это не единственный способ, и предполагается, что запятые всегда являются разделителями полей & ndash;

perl -ne 'print "$.: $_" if 15 > split/,/' my-comma-file.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...