Замена процесса с помощью Perl-скрипта

Чтобы указать имя файла в качестве аргумента скрипта, вам необходимо использовать позиционные параметры

Для этого можно использовать следующий скрипт:

#!/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

4
30.09.2020, 13:39
1 ответ

Сценарий использует-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из этого скрипта. Или перепишите этот скрипт, чтобы он работал с <<>>/ <>(, чтобы он также работал на стандартном вводе, когда не передавался какой-либо файловый аргумент )и выводился на стандартный вывод. Я действительно не вижу смысла принимать имена файлов в качестве аргументов, поскольку он обрабатывает их все в потоковом режиме.

7
18.03.2021, 23:01

Теги

Похожие вопросы