Sed

如何從fish中的輸入中檢索前N行和最後M行?

  • May 11, 2017

我有這樣的輸入:

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}}"

這是一種技術:

$ 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

像這樣:

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

由於 awk 在文件到達文件末尾之前不可能知道文件中的行數,因此您需要將行數作為變數輸入 awk。

引用自:https://serverfault.com/questions/847818