Unix - количество столбцов в файле

Для файла с данными, подобными этому (т.е. файл store.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

Ответ 1

awk -F'|' '{print NF; exit}' stores.dat 

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

Ответ 2

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

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

$ head -1 stores.dat | tr '|' '\n' | wc -l

Ответ 3

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

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

Ответ 4

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

cat FILE | awk '{print NF}'

Ответ 5

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

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
    stores.dat

Ответ 6

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

head -n 1 file.name | awk -F'|' '{print NF; exit}'

Ответ 7

Решение Perl аналогично решению Mat awk:

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

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


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

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

Ответ 8

Основываясь на ответе Cat Kerr. Эта команда работает над solaris

awk '{print NF; exit}' stores.dat

Ответ 9

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

head -1 stores.dat | grep -o \|  | wc -l

Ответ 10

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

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l