Сценарии: копировать только часть между двумя указанными строками

Например

Файл 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
Другие вопросы по тегам