Чистый раствор Unix (без AWK/Perl):
$ cat /tmp/x1
1|2|3|34
4534|23442|1121|334434
$ head -1 /tmp/x1 | tr "|" "\012" | wc -l
4
Perl, решение - 1-вкладыш:
$ perl5.8 -naF'\|' -e 'print scalar(@F)."\n";exit;' /tmp/x1
4
НО !!!! ВАЖНЫЙ!!!
Каждое из этих решений, а также ответы на другие ответы, НЕ работают на 100%!
А именно, все они ломаются, когда это реальный файл «труба отделенного», с трубой является допустимым символом в поле (и поле цитирует), как реальные CSV файлы работы.
E.g.
$ cat /tmp/x2
"0|1"|2|3|34
4534|23442|1121|334434
$ perl5.8 -naF'\|' -e 'print scalar(@F)."\n";exit;' /tmp/x1
5 <----- BROKEN!!! There are only 4 fields, first field is "0|1"
Чтобы исправить это, правильный CSV (или файл с разделителями) синтаксический анализатор должен быть использован, например, один в Perl:
$ perl5.8 -MText::CSV_XS
-ne '$csv=Text::CSV_XS->new({sep_char => "|"}); $csv->parse($_);
print $csv->fields(); print "\n"; exit;' /tmp/x2
печать правильное значение
4
Как примечание, простое исправление решения awk
или sed
с извилистым RegEx не будет работать легко, так как поверх труб, содержащих-и-q uoted PSV, спецификация также позволяет котировки как часть поля. Это НЕ поддается хорошему решению RegEx.
Единственный способ, которым я могу думать, что вы получили 5 вместо 4 с этой командой, - это если вы на самом деле делали 'awk -F \" ... '(или вместо двойной кавычки, один из других символов, который возникает 4 раза в строке, например 'd' или' i' ...). Фактически, с 'NF-1', вы должны были получить 3 вместо этого ... – twalberg
Но ваш пример не содержит« medicare | medicaid » – runrig
Если у вас есть данные, которые могут содержать разделитель в значениях указанного кавычки, вам нужен специализированный анализатор в формате CSV. Шансы - ['csvfix'] (http://code.google.com/p/csvfix/)) может делать то, что вам нужно. См. также [Инструмент Linux для анализа файлов CSV] (http://stackoverflow.com/questions/1063125/linux-tool-to-parse-csv-files). вполне вероятно, что у Python и Ruby тоже есть модули. –