如何从input的鱼中检索前N和后M行?

我有一个input:

1 2 3 4 5 6 7 8 

我想从这个input中只检索N个第一行和M个最后一行。

例如,如果N是2,M是4,我想要的结果是:

 1 2 5 6 7 8 

线可以重叠,所以如果N是6,M是4,我希望输出等于我的input。

我曾尝试使用awk,没有运气:

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

这里有一个技巧:

 $ 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在到达文件结束之前不可能知道文件中的行数,因此需要将行数作为variablesinput到awk中。