Я предполагаю, что ваш конвейер является частью скрипта, который принимает один аргумент (количество возвращаемых строк ).
Расширение параметра ${$1:-5}
недействительно и должно быть записано как ${1:-5}
, чтобы оно расширялось до 5
, если $1
пусто или не установлено.
Кроме того, ваш awk
код вызывает sort
, который немного запутан, в частности потому, что его можно легко вставить в конвейер как собственную стадию:
awk '{ print length(), NR, $0 }' unix1.txt |
sort -rn |
head -n "${1:-5}" |
sed 's/[^ ]* //' |
sort -n
Чтобы немного упростить (замените sed
наcut
)и чтобы сделать вывод более «табличным», мы можем вывести промежуточный результат из awk
с табуляцией в качестве разделителя вывода:
awk -v OFS="\t" '{ print length(), NR, $0 }' unix1.txt |
sort -rn |
head -n ${1:-5} |
cut -f 2- |
sort -n
Для данных данныхэто выведет следующее для количества строк вывода по умолчанию:
2 kbjkbkbbnbnmbnmnmmnbmnbmjbjkb
4 asjdsakdbakjsdbasbkj
5 asjdsakdbakjsdbasbkj
16 ffdsdfggdgdgdfgdfgdf112233
17 qwertyuiopsdfghjklxcvbnm,fghjk
Чтобы обработать несколько файлов в вашем скрипте, я бы предложил зациклиться на заданных именах файлов. Может что-то вроде
#!/bin/sh
n=${1:-5}
shift
for name do
if [ "$#" -gt 1 ]; then
printf 'File: %s\n' "$name"
fi
awk -v OFS="\t" '{ print length(), NR, $0 }' "$name" |
sort -rn |
head -n "$n"
cut -f 2- |
sort -n
done
Этот сценарий будет вызываться как
./script.sh 10 file1 file2 file3 etc
Обратите внимание, что это требует , чтобы первый аргумент всегда был числом (и чтобы в сценарии не было ничегоbash
-определенного, поэтому я использую /bin/sh
в качестве интерпретатора )]. Чтобы использовать правильные параметры командной строки для присвоения номера сценарию, например. как
./script -n 10 file1 file2
вам придется изучить возможность использования getopts
для синтаксического анализа командной строки. На этом сайте (есть много примеров тому, что вы можете начать с тега getopts ).