我有一个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中。