Использование ksh для возврата файла с наибольшим количеством строк в каталоге - PullRequest
0 голосов
/ 09 февраля 2019

Я пишу файл ksh, в котором я хочу вернуть файл с наибольшим количеством строк в каталоге.Сценарий может принимать только один аргумент и должен быть допустимым каталогом.У меня есть 2 случая ошибок, но у меня возникли проблемы с файлами с максимальным количеством строк. У меня есть следующие значения:

#!/bin/ksh
#Script name: maxlines.sh
ERROR1="error: can only use 0 or 1 arguments.\nusage: maxlines.sh [directory]"
ERROR2="error: argument must be a directory.\nusage: maxlines.sh [directory]\n"
$1
if [[ $# -gt 1 ]]
        then
                printf "$ERROR1"
                exit 1
fi
if [ ! -d "$1" ]
        then
        prinf "$ERROR2"
fi
for "$1"
do
    [wc -l | sort -rn | head -2 | tail -1]

Из того, что я нашел, максимальное количество строк будет получено при использовании wc, ноЯ не уверен в форматировании, так как я все еще новичок в сценариях оболочки.Любой совет поможет!

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019
> for "$1"
> do
>    [wc -l | sort -rn | head -2 | tail -1]

Цикл for имеет небольшую синтаксическую ошибку, и квадратные скобки полностью не на месте.В любом случае вам не нужен цикл, потому что wc принимает список аргументов имени файла.

wc -l "$1"/* | sort -rn | head -n 1

Верхняя строка, а не вторая, будет содержать файл с наибольшим количеством строк.Возможно, вы захотите добавить опцию для обрезки числа и возврата только имени файла.

Если вы хотите зациклить файлы в $1, это будет выглядеть как

for variable in list of items
do
    : things with "$variable"
done

, где list of items может быть подстановочным выражением "$1"/* (как указано выше), а do ... done занимает место, где, как вы думаете, вам нужны квадратные скобки.

(Для сравнения используются квадратные скобки; [ 1 -gt 2 ] запускает команду [ для сравнения двух чисел. Она может сравнивать множество разных вещей - строки, файлы и т. Д. ksh также имеет более развитый вариант [[который имеет некоторые особенности по сравнению с традиционными [.)

0 голосов
/ 09 февраля 2019

мои цитаты немного ржавые, но попробуйте этот скрипт оболочки Bourne:

#!/bin/sh
#Script name: maxlines.sh
ERROR1="error: can only use 0 or 1 arguments.\nusage: maxlines.sh [directory]"
ERROR2="error: argument must be a directory.\nusage: maxlines.sh [directory]\n"
echo argument 1: "$1"
if [ $# -gt 1 ]
        then
        echo "$ERROR1"
    exit 1
fi
if [ ! -d "$1" ]
        then
        echo "$ERROR2"
    exit 1
fi
rm temp.txt
#echo "$1"/*
for i in "$1"/*
    do
    if [ -f "$i" ] 
        then
            #echo 2: $i
            wc -l "$i" >> temp.txt
        #else echo $1 is not a file!
    fi
    done
cat temp.txt | sort -rn | head -1
...