Учитывая текстовый файл неизвестной длины, как я могу прочитать, например все но первые 2 строки файла? Я знаю, что tail
даст мне последние N строк, но я не знаю, что N опережает время.
Так что для файла
AAAA
BBBB
CCCC
DDDD
EEEE
я хочу
CCCC
DDDD
EEEE
И для файла
AAAA
BBBB
CCCC
Я бы просто получил
CCCC
tail --help
дает следующее:
-n, --lines=K output the last K lines, instead of the last 10;
or use -n +K to output lines starting with the Kth
Итак, чтобы отфильтровать первые 2
строки, -n +3
должен даст вам результат, который вы ищете (начиная с 3-го).
Я действительно не знаю, как это сделать, просто используя хвост или голову, но с помощью wc -l
(количество строк) и выражения bash, вы можете этого добиться.
tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE
Надеюсь, это поможет.
Предполагая, что ваша версия хвоста это поддерживает, вы можете указать начало хвоста после X строк. В вашем случае вы бы сделали 2 + 1.
tail -n +3
[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE
tail -n + linecount filename
начнет вывод со строки linecount
из filename
, поэтому tail -n +3 filename
должен делать то, что хочешь.
Используйте это, предположим, что первый образец называется sample1.dat, затем tail --lines = 3 sample1.dat
, который распечатает все строки с 3-й до последней.
Для второго примера снова предположим, что он называется sample2.dat, это будет tail --lines = -1 sample2.dat
, который напечатает последнюю строку ...
использование awk для получения всех строк, кроме последних 2
awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file
awk для получения всех строк, кроме первых 2
awk 'NR>2' file
ИЛИ вы можете использовать еще
more +2 file
или просто bash
#!/bin/bash
i=0
while read -r line
do
[[ $i > 1 ]] && echo "$line"
((i++))
done <"file"
Простое решение с использованием awk:
awk 'NR > 2 { print }' file.name