如何使用sed以指定的顺序提取行?

Jaz*_*Flo 16 unix linux bash sed

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

sed -n 'Np;Np;Np' inputFile.txt > outputFile.txt
Run Code Online (Sandbox Code Playgroud)

('N'是特定的行,我想提取)

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

sed -n '200p;33p;40,000p' inputFile.txt > outputFile.txt
Run Code Online (Sandbox Code Playgroud)

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

gle*_*man 13

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

sed -n '33h; 200{p; g; p}; 40000p' file
Run Code Online (Sandbox Code Playgroud)

有关详细说明,请参阅手册: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 
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Ric*_*lia 3

您还可以使用其他 bash 命令吗?在这种情况下,这有效:

for i in 200 33 40000; do 
    sed -n "${i}p" inputFile.txt
done > outputFile.txt
Run Code Online (Sandbox Code Playgroud)

这可能比在 sed 中使用数组慢,但更实用。

  • 如果您要多次解析文件,那么至少在打印所需行后退出: `sed -n "${i} {p;q}"` (4认同)