Bash tool to get nth line from a file

前端 未结 19 2512
刺人心
刺人心 2020-11-22 08:07

Is there a \"canonical\" way of doing that? I\'ve been using head -n | tail -1 which does the trick, but I\'ve been wondering if there\'s a Bash tool that speci

19条回答
  •  情书的邮戳
    2020-11-22 08:42

    As a followup to CaffeineConnoisseur's very helpful benchmarking answer... I was curious as to how fast the 'mapfile' method was compared to others (as that wasn't tested), so I tried a quick-and-dirty speed comparison myself as I do have bash 4 handy. Threw in a test of the "tail | head" method (rather than head | tail) mentioned in one of the comments on the top answer while I was at it, as folks are singing its praises. I don't have anything nearly the size of the testfile used; the best I could find on short notice was a 14M pedigree file (long lines that are whitespace-separated, just under 12000 lines).

    Short version: mapfile appears faster than the cut method, but slower than everything else, so I'd call it a dud. tail | head, OTOH, looks like it could be the fastest, although with a file this size the difference is not all that substantial compared to sed.

    $ time head -11000 [filename] | tail -1
    [output redacted]
    
    real    0m0.117s
    
    $ time cut -f11000 -d$'\n' [filename]
    [output redacted]
    
    real    0m1.081s
    
    $ time awk 'NR == 11000 {print; exit}' [filename]
    [output redacted]
    
    real    0m0.058s
    
    $ time perl -wnl -e '$.== 11000 && print && exit;' [filename]
    [output redacted]
    
    real    0m0.085s
    
    $ time sed "11000q;d" [filename]
    [output redacted]
    
    real    0m0.031s
    
    $ time (mapfile -s 11000 -n 1 ary < [filename]; echo ${ary[0]})
    [output redacted]
    
    real    0m0.309s
    
    $ time tail -n+11000 [filename] | head -n1
    [output redacted]
    
    real    0m0.028s
    

    Hope this helps!

提交回复
热议问题