Сценарии: копировать только часть между двумя указанными строками
Например
Файл a.txt
имеет следующий контекст
aaa
bbb
ccc
ddd
eee
Какой сценарий может достичь этой цели, такой, что
script.sh a.txt 2 4
выход:
bbb
ccc
ddd
Где 2 и 4 - указанные номера строк.
4 ответа
Решение
Ты можешь использовать awk
за это:
awk 'NR>=2 && NR<=4' file
В общем,
awk -v beginning=$first -v end=$last 'NR>=beginning && NR<=end' $file
так что это вопрос чтения $file
, $first
а также $last
в вашем сценарии.
Обновить:
На основании комментария doubleDown (спасибо!) Это также можно сделать так:
awk 'NR==2, NR==4' file
и более общий:
awk -v beginning=$first -v end=$last 'NR==beginning, NR==end' $file
sed
это примитивный инструмент, который хорошо справляется с этим:
sed -n '2,4p' file # method 1
sed '2,4!d' file # method 2
Смотрите sed1line.txt; отличный ресурс для sed
однострочечники.
Самый краткий способ сделать это с sed
:
$ sed '2,4!d' file
bbb
ccc
ddd
Лучший выбор - использовать awk или sed, как уже упоминалось. Если вам нравится использовать только традиционные утилиты, вы можете сделать такой трюк (где $FILE - a.txt):
#!/bin/env bash
FILE=a.txt
SIZE=`wc -l $FILE`
let STARTPOS=$SIZE-$1
let OFFSET=$2-$1
cat $FILE | tail -n $STARTPOS | head -n $OFFSET