Скрипт, который печатает указанные c строки файла - PullRequest
0 голосов
/ 30 апреля 2020

У меня возникли проблемы с этим сценарием, который печатает содержимое файла с заданного номера строки на следующий указанный номер строки. Если START больше, чем END (пример ./script file 10 7), мне нужно вывести строки из аргумента START обратно в аргумент END (так в основном строка 10, затем строка 9 8 7).

#!/bin/sh

START=$1
END=$2
FILENAME=$3

ERROR="[PINCH ERROR]"
if [ $# -lt 3 ]; then
    echo "$ERROR Need three arguments: Filename Start-line End-line"
    exit 1
fi

if [ ! -f "$FILENAME" ]; then
    echo -e "$ERROR File does not exist. \n\t$FILENAME"
    exit 1
fi

if [ "$START" -gt "$END" ]; then
    echo -e "$END $START"
    exit 1
fi

if [ "$START" -lt 0 ]; then
    echo -e "$ERROR Start line is less than 0."
    exit 1
fi

if [ "$END" -lt 0 ]; then
    echo -e "$ERROR End line is less than 0."
    exit 1
fi

NUMOFLINES=$(wc -l < "$FILENAME")

ENDDIFF=$(( NUMOFLINES - END ))

if [ "$START" -lt "$ENDDIFF" ]; then
    < "$FILENAME" head -n $END | tail -n +$START
else
    < "$FILENAME" tail -n +$START | head -n $(( END-START+1 ))
fi

exit 0 

1 Ответ

0 голосов
/ 30 апреля 2020

Поскольку вы отметили это linux, у вас, вероятно, есть ta c (1) , что упрощает:

if [ "$START" -le "$END" ]; then
   # Normal output
   sed -n "${START},${END}p; ${END}q" "$FILENAME"
else
    # Reverse output
    sed -n "${END},${START}p; ${START}q" "$FILENAME" | tac
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...