从文本文件打印非连续行的快速 Unix 命令?

Quick Unix command to print non-contiguous lines from a text file?

给定一个名为 "people.txt" 的文本文件,其中包含:

Anne
Bob
Carl
Daphne
Erwin
Gary
Heather

如何使用仅指定一组非连续行号的 sed 命令或类似的单行命令来过滤内容以获得此结果:

Bob
Erwin
Heather

(注意:忽略它们是按字母顺序排列的事实)

注意我用的真实文件超过100K行,所以回答要考虑效率。

我知道我可以使用:

sed '5q;d' people.txt 

只得到 第 5 行 ("Erwin"),但是这个参数是否有变体,我可以在其中指定任意行号的列表?

我认为单独使用 sed 是可能的,但即使在通读 man sed 之后,我也无法弄清楚这一点。我一直在寻找与此非常接近的其他答案,但几乎所有答案都涉及获取单行或连续行(一系列行),或者使用更复杂的 bash 脚本;例如,"Quick unix command to display specific lines in the middle of a file?" and "How can I print specific lines from a file in Unix?".

您可以按号码查询特定线路,如下所示:

sed -n '1p;5p;7p' my_file

-n 标志表示 "don't print lines by default",然后为您想要的每一行指定行号和 p(打印)命令。

动态生成sed程序:

将你想要的行存储在一个数组中:

$ lines=(2 5 7)
$ sed -n "$(printf "%dp;" "${lines[@]}")" file
Bob
Erwin
Heather

或者如果行号在文件中:

$ sed -n "$(sed 's/$/p/' numbers)" file
$ awk -v lines="2 4 7" 'index(" "lines" "," "NR" ")' file  
Bob
Daphne
Heather

$ awk -v lines="3 5" 'index(" "lines" "," "NR" ")' file  
Carl
Erwin

上面 linesNR 周围的空白字符是必需的,以便 NR9lines 包含 19,例如。

如果您不介意在脚本中硬编码行号,您也可以这样做:

awk 'NR~/^(2|4|7)$/' file