如何从 fish 输入中检索前 N 行和后 M 行?

如何从 fish 输入中检索前 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}}"

答案1

以下是一种技巧:

$ 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这样,您将通过这种方法得到重复的行。

或者,使用fish的数组下标:

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

答案2

像这样:

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

由于 awk 在到达文件末尾之前不可能知道文件中的行数,因此需要将行数作为变量输入到 awk 中。

相关内容