我有一个这样的输入:
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 中。