Назад | Перейти на главную страницу

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

У меня есть ввод вроде:

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}}"

Как это:

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

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

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

$ 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