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