unix - количество столбцов в файле - PullRequest
61 голосов
/ 25 декабря 2011

Имеется файл с такими данными (например, файл stores.dat)

sid|storeNo|latitude|longitude
2|1|-28.03720000|153.42921670
9|2|-33.85090000|151.03274200

Какой будет команда для вывода количества имен столбцов?

т.е. В приведенном выше примере это будет 4. (количество символов канала + 1 в первой строке)

Я думал что-то вроде:

awk '{ FS = "|" } ; { print NF}' stores.dat

но он возвращает все строки вместо первой и для первой строки возвращает 1 вместо 4

Ответы [ 11 ]

95 голосов
/ 25 декабря 2011
awk -F'|' '{print NF; exit}' stores.dat 

Просто выйдите сразу после первой строки.

34 голосов
/ 25 декабря 2011

Это обходной путь (для меня: я не очень часто использую awk):

Отображение первой строки файла, содержащего данные, замена всех каналов на новые строки и затем подсчет строк:

$ head -1 stores.dat | tr '|' '\n' | wc -l
11 голосов
/ 25 декабря 2011

Если вы не используете там пробелы, у вас должна быть возможность использовать | wc -w в первой строке.

wc - это "Количество слов", которое просто считает слова во входном файле.,Если вы отправите только одну строку, она сообщит вам количество столбцов.

4 голосов
/ 23 октября 2013

Вы можете попробовать

кошка ФАЙЛ | awk '{print NF}'

1 голос
/ 10 сентября 2015

Perl-решение, похожее на решение Мата по awk:

perl -F'\|' -lane 'print $#F+1; exit' stores.dat

Я проверил это на файле с 1000000 столбцами.


Если разделитель полей - это пробел (один или несколько пробелов или табуляций) вместо канала:

perl -lane 'print $#F+1; exit' stores.dat
1 голос
/ 12 сентября 2013

Обычно это то, что я использую для подсчета количества полей:

head -n 1 file.name | awk -F'|' '{print NF; exit}'
1 голос
/ 25 декабря 2011

Если у вас установлен Python, вы можете попробовать:

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
    stores.dat
0 голосов
/ 01 марта 2019

Правильно чистый way

Под bash вы можете просто:

IFS=\| read -ra headline <stores.dat
echo ${#headline[@]}
4

Гораздо быстрее, как без вилок и многоразового использованиякак $headline удерживать полную линию головы.Например, вы могли бы:

printf " - %s\n" "${headline[@]}"
 - sid
 - storeNo
 - latitude
 - longitude

Примечание Этот синтаксис будет корректно использовать пробелы и другие символы в именах столбцов.

Альтернатива: строгая двоичная проверка на максимальное количество столбцов вкаждая строка

Что если в какой-то строке есть несколько дополнительных столбцов?

Эта команда будет искать большую строку, считая разделителей :

tr -dc $'\n|' <stores.dat |wc -L
3

Максимум 3 разделителя, затем 4 поля.

0 голосов
/ 04 октября 2017

выберите любую строку в файле (в приведенном ниже примере это вторая строка) и сосчитайте количество столбцов, где разделитель - пробел:

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l
0 голосов
/ 30 ноября 2016

Вы можете попробовать:

head -1 stores.dat | grep -o \|  | wc -l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...