从文本文件打印非连续行的快速 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
上面 lines
和 NR
周围的空白字符是必需的,以便 NR
值 9
在 lines
包含 19
,例如。
如果您不介意在脚本中硬编码行号,您也可以这样做:
awk 'NR~/^(2|4|7)$/' 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
上面 lines
和 NR
周围的空白字符是必需的,以便 NR
值 9
在 lines
包含 19
,例如。
如果您不介意在脚本中硬编码行号,您也可以这样做:
awk 'NR~/^(2|4|7)$/' file