Что противоположно голове?Я хочу все, кроме первых N строк файла - PullRequest
122 голосов
/ 18 августа 2010

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

Так для файла

AAAA
BBBB
CCCC
DDDD
EEEE

хочу

CCCC
DDDD
EEEE

А для файла

AAAA
BBBB
CCCC

Я бы получил только

CCCC

Ответы [ 8 ]

181 голосов
/ 18 августа 2010

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-го).

18 голосов
/ 18 августа 2010

Предполагая, что ваша версия tail поддерживает это, вы можете указать начало хвоста после X строк.В вашем случае вы бы сделали 2 + 1.

tail -n +3

[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE
12 голосов
/ 18 августа 2010

Простое решение с использованием awk:

awk 'NR > 2 { print }' file.name
7 голосов
/ 18 августа 2010

Попробуйте sed 1,2d.Замените 2 при необходимости.

5 голосов
/ 18 августа 2010

tail -n +linecount filename начнет вывод в строке linecount из filename, поэтому tail -n +3 filename должен делать то, что вы хотите.

0 голосов
/ 18 августа 2010

используя 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"
0 голосов
/ 18 августа 2010

Я действительно не знаю, как сделать это только с хвоста или головы, но с помощью wc -l (количество строк) и выражения bash, вы можете достичь этого.

tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE

Надеюсь, это поможет.

0 голосов
/ 18 августа 2010

Используйте это, предполагая, что первый образец называется sample1.dat, а затем tail --lines=3 sample1.dat, который будет печатать все строки с 3-й строки до последней.

Для второго примера снова предположим, что он называется sample2.dat, это будет tail --lines=-1 sample2.dat, который напечатает последнюю строку ...

...