unix - количество столбцов в файле
Имеется файл с такими данными (например, файл 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
10 ответов
awk -F'|' '{print NF; exit}' stores.dat
Просто выйдите сразу после первой строки.
Это обходной путь (для меня: я не очень часто использую awk):
Отобразите первую строку файла, содержащего данные, замените все каналы на новые строки, а затем сосчитайте строки:
$ head -1 stores.dat | tr '|' '\n' | wc -l
Если вы не используете там пробелы, вы должны иметь возможность использовать | wc -w
на первой линии.
wc
это "Количество слов", которое просто считает слова во входном файле. Если вы отправите только одну строку, она сообщит вам количество столбцов.
Perl-решение, похожее на решение Мата по awk:
perl -F'\|' -lane 'print $#F+1; exit' stores.dat
Я проверил это на файле с 1000000 столбцами.
Если разделитель полей - это пробел (один или несколько пробелов или табуляций) вместо канала:
perl -lane 'print $#F+1; exit' stores.dat
Обычно это то, что я использую для подсчета количества полей:
head -n 1 file.name | awk -F'|' '{print NF; exit}'
Если у вас установлен Python, вы можете попробовать:
python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
stores.dat
Выберите любую строку в файле (в приведенном ниже примере это вторая строка) и сосчитайте количество столбцов, где разделитель - пробел:
sed -n 2p text_file.dat | tr ' ' '\n' | wc -l
Правильный чистый способ
Под 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 поля.
Основано на ответе Кэт Керр. Эта команда работает на солярисе
awk '{print NF; exit}' stores.dat
Вы можете попробовать:
head -1 stores.dat | grep -o \| | wc -l