给定一个名为" 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?"。
答案 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
上述lines
和NR
周围的空白字符是必要的,因此当NR
包含{{1}时,9
值lines
不匹配例如。
如果您不介意对脚本中的行号进行硬编码,您可以选择:
19
答案 2 :(得分:0)
动态生成sed程序:
将所需的行存储在数组中:
$ lines=(2 5 7)
$ sed -n "$(printf "%dp;" "${lines[@]}")" file
Bob
Erwin
Heather
或行号是否在文件中:
$ sed -n "$(sed 's/$/p/' numbers)" file