Quick Unix命令用于从文本文件中打印非连续行?

时间:2015-02-09 19:49:34

标签: shell unix text sed

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

Anne
Bob
Carl
Daphne
Erwin
Gary
Heather

如何使用sed命令或类似的one-liner,它只指定一组非连续的行号,以便将内容过滤到此结果:

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?""How can I print specific lines from a file in Unix?"

3 个答案:

答案 0 :(得分:7)

您可以按照以下方式询问具体行

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

-n标志表示“默认情况下不打印行”,然后对于您想要的每一行,指定行号和p(打印)命令。

答案 1 :(得分:1)

$ 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周围的空白字符是必要的,因此当NR包含{{1}时,9lines不匹配例如。

如果您不介意对脚本中的行号进行硬编码,您可以选择:

19

答案 2 :(得分:0)

动态生成sed程序:

将所需的行存储在数组中:

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

或行号是否在文件中:

$ sed -n "$(sed 's/$/p/' numbers)" file