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



учитывая файл с такими данными (т. е. магазины.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

562   10  

10 ответов:

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

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

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

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

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

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

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

вы могли бы попробовать

cat FILE / awk ' {print NF}'

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

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

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

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

решение Perl аналогично решению awk Мата:

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

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


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

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

на основе ответа Кэт Керр. Эта команда работает на solaris

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

можно попробовать:

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

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

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

Comments

    Ничего не найдено.