Прочитанных строк, начиная с номера строки в bash-скрипт

Я пытаюсь прочитать файл строка за строкой, начиная с определенной строки в bash. Я уже использовал команду while для чтения каждой строки файла, увеличивая количество. Могу ли я начать с определенной строки?

let count=0
declare -a ARRAY

while read LINE; do
ARRAY[$count]=$LINE 
vech=${ARRAY[$count]}
    if [...blah ..]
     then
    ...blah..
    fi 
sleep 2 
((count++)) 
done < filec.c 

любая помощь в виде предложений или алгоритмов приветствуется.

Edit: я пытаюсь передать номер строки в качестве переменной . Я Grepping для определенного шаблона, и если он найден, должен передать номер строки, начиная по образцу.

5 ответов


Я хотел бы использовать sed ' s адреса чтобы начать с определенного номера строки и распечатать в конце файла:

lineNumber=10
sed -n "$lineNumber"',$p' |
while read line; do
  # do stuff
done

либо это, либо, как предложил Фредрик, использовать awk:

lineNumber=10
awk "NR > $lineNumber" |
while read line; do
  # do stuff
done

Как насчет чего-то подобного?

while read -r line
do
    echo "$line"
done < <(tail -n +number file.name)

он не совместим с POSIX, но попробуйте свой Bash. Конечно, делайте то, что вы хотите с $line внутри цикла while.
PS: изменить номер с yhe номер строки вы хотите и файл.имя с именем файла.


некоторые из многих способов:http://mywiki.wooledge.org/BashFAQ/011

лично:

printf '%s\n' {1..6} | { mapfile -ts 3 x; declare -p x; }                  

кроме того, не используйте имена переменных all-caps.


просто держите счетчик. Чтобы напечатать все строки после определенной строки, вы можете сделать следующее:

#!/bin/bash

cnt=0
while read LINE
do
    if [ "$cnt" -gt 5 ];
    then
        echo $LINE
    fi
    cnt=$((cnt+1))
done < lines.txt

или, почему бы не использовать на awk:

awk 'NR>5' lines.txt 

просто прочитайте определенное количество строк до нужного числа и начните свою логику, чтобы прочитать остальное.

невозможно сэкономить на "текстовом" файле, вы не можете пропустить строки, не прочитав их. Линии разделены 0x0a и переменной длины. Поэтому каждый разделитель должен быть отсканирован и подсчитан, чтобы достичь определенного "номера строки". Есть уловки, которые позволяют думать, что ты их не читал, но ты читал.