У меня есть ввод вроде:
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