Чтобы указать имя файла в качестве аргумента скрипта, вам необходимо использовать позиционные параметры
Для этого можно использовать следующий скрипт:
#!/bin/bash
awk '{ print NF; exit }' "$1"
Предполагается, что вас интересует только количество столбцов в первой строке.
Если вы хотите найти строку с наибольшим количеством столбцов, вы можете:
#!/bin/bash
awk 'NF > max { max = NF } END { print max }' "$1"
Это проверит длину всех строк в файле и напечатает самую длинную
Теперь, если вы хотите указать разделитель, вы можете использовать несколько позиционных параметров.:
#!/bin/bash
delim=$1
file=$2
awk -F "$delim" 'NF > max { max = NF } END { print max }' "$file"
Это позволит вам подсчитать максимальный размер столбца во всех типах файлов, таких как csv:
./columnCounter, tempfile.csv
Чтобы получить еще больше фантазии, мы могли бы использовать getopts
для разбора аргументов:
#!/bin/bash
while getopts d:f: opt; do
case $opt in
d) delim=$OPTARG;;
f) file=$OPTARG;;
esac
done
awk -F "$delim" 'NF > max { max = NF } END { print max }' "$file"
Тогда это будет называться как:
./columCounter -d, -f tempfile.csv
Сценарий использует-T the-source-file
для определения того, содержит ли файл текст .
Этот оператор -T
считывает начало файла и использует эвристику, чтобы определить, похоже ли это на текст или нет. Но если файл представляет собой канал, как в случае <(...)
, то то, что он прочитал, не может быть прочитано снова.
Вы можете воспроизводить с помощью:
$ perl -e '$file = shift; -T $file; open F, "<", $file; print while <F>' <(seq 1867)
1861
1862
1863
1864
1865
1866
1867
Посмотрите, как -T
потребляет 8 КБ из вывода seq
, которых больше нет для чтения цикла while <F>
.
Здесь вы можете использовать zsh и его =(...)
форму подстановки процессов, которая использует временный файл вместо канала. Или (... | psub -f)
в оболочке fish
. Или удалите этот вызов -T
из этого скрипта. Или перепишите этот скрипт, чтобы он работал с <<>>
/ <>
(, чтобы он также работал на стандартном вводе, когда не передавался какой-либо файловый аргумент )и выводился на стандартный вывод. Я действительно не вижу смысла принимать имена файлов в качестве аргументов, поскольку он обрабатывает их все в потоковом режиме.