2016-06-13 2 views

ответ

2
head -n<SkipLines> <filename> | tail -n<TakeLines> 

так что если вы хотите взять 2 строки с 10-го файла pippo.txt:

head -n10 pippo.txt | tail -n2 

EDIT:

Чтобы добавить его в другой файл просто сделать:

head -n<SkipLines> <filename> | tail -n<TakeLines> >> <OtherFile> 

head -n10 pippo.txt | tail -n2 >> pippo2.txt 
1

Предполагая, что Bash≥4.

Чтобы извлечь строку 42 из файла inputfile и добавить его в файл outputfile так просто, как:

# data 

input=inputfile 
output=outputfile 
linenb=42 

# get line number 
mapfile -t -s $((linenb-1)) -n 1 line < "$input" || exit 1 

# check that we got a line 
if ((${#line[@]}==0)); then 
    printf >&2 'Line %d not found in file %s\n' "$linenb" "$input" 
    exit 1 
fi 

# append it to output file 
printf '%s\n' "$line" >> "$output" 

Pure Bash!

+0

Похоже, что небольшая часть накладных расходов загружает весь файл в массив в памяти, чтобы использовать только N строк из этого файла. – andlrc

+0

@andlrc: он не загружает весь файл вообще: он _skips_ первые строки (это то, что делает опция '-s') и _stops после прочтения одной строки_ (это делает опция' -n 1'). Это очень эффективно! –

+0

Вижу, спасибо за разъяснение :-) Я буду читать на 'mapfile' – andlrc

Смежные вопросы