Как получить первые N и последние M строк из ввода в рыбе?

У меня есть вход как:

1
2
3
4
5
6
7
8

И я хотел бы получить только N первых и M последних строк из этого ввода.

Например, если N равно 2, а M равно 4, я хочу, чтобы результат был:

1
2
5
6
7
8

Линии могут перекрываться, поэтому, если N равно 6, а M равно 4, я хочу, чтобы вывод был равен моему вводу.

Я попытался с помощью awk, но не повезло:

cat input | awk "{if (NR<2 || NR>count - 4) {print}}"

2 ответа

Решение

Вот одна из техник:

$ seq 10 > input
$ set N 2; set M 4
$ set wanted (sed $N'q' input; tac input | sed $M'q' | tac)
$ printf "%s\n" $wanted
1
2
7
8
9
10

Если N+M > num_lines тогда вы получите дубликаты строк с этим подходом.

Или используйте подписку на массив рыб:

$ set lines (cat input)
$ printf "%s\n" $lines[1..$N] $lines[(math (count $lines) - $M + 1)..-1]
1
2
7
8
9
10

Как это:

awk 'NR <= 2 || lines - 4 < NR {print}' lines=(wc -l input) input

Поскольку awk не может знать количество строк в файле до того, как он достигнет конца файла, вам нужно ввести количество строк в качестве переменной для awk.

Другие вопросы по тегам