linux - 如何使用 sed 按指定顺序提取行?

标签 linux bash unix sed

我有一个大约 50,000 行长的文件,我需要检索特定的行。我尝试了以下命令:

sed -n 'Np;Np;Np' inputFile.txt > outputFile.txt

('N'是具体的行,我想提取)

这工作正常,但命令提取 ORDER 中的行(即它重新排序我的输入)ex。如果我尝试:

sed -n '200p;33p;40,000p' inputFile.txt > outputFile.txt

我得到一个文本文件,其中的行顺序为:33、200、40,000(这对我的目的不起作用)。有没有办法保持命令中各行出现的顺序?

最佳答案

你必须坚持第 33 行,直到看到第 200 行:

sed -n '33h; 200{p; g; p}; 40000p' file

有关进一步说明,请参阅手册:https://www.gnu.org/software/sed/manual/html_node/Other-Commands.html

awk 可能更具可读性:

awk '
    NR == 33    {line33 = $0} 
    NR == 200   {print; print line33} 
    NR == 40000 {print}
' file 

如果您要按特定顺序打印任意数量的行,您可以概括为:

awk -v line_order="11 3 5 1" '
    BEGIN {
        n = split(line_order, inorder)
        for (i=1; i<=n; i++) linenums[inorder[i]]
    }
    NR in linenums {cache[NR]=$0}
    END {for (i=1; i<=n; i++) print cache[inorder[i]]}
' file

关于linux - 如何使用 sed 按指定顺序提取行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39849929/

相关文章:

bash - 如何在Dockerfile中正确格式化嵌套的bash命令?

linux - 环境变量是通过内存中还是磁盘上的 "set-environment"在 Linux 上的 systemd 中创建的?

linux - 在 Unix 中将 Mono 应用程序的文件放在哪里

linux - 从文件中提取路径然后将文件复制到另一个路径并将它们重命名为 bash 脚本

php - 绝对路径从哪里开始?

linux - Linux 上 scp 的协议(protocol)不可用错误

linux - strace 上的 grep 仅使用 stderr 到 stdout

c - 找出与 sendto 函数中使用的套接字关联的 src IP 和端口

bash - 在 Bash 中 ssh 和运行多个命令的最干净的方法是什么?

unix - 用 vi(m) 复制最后一行之后的所有行