Size: 620
Comment:
|
Size: 1538
Comment: Agree with Lhunath - rm useless note. Fix writing style.
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
[[Anchor(faq11)]] | <<Anchor(faq11)>> |
Line 3: | Line 3: |
The dirty (but not quick) way would be {{{sed -n ${n}p "$file"}}} but this reads the whole input file, even if you only wanted the third line. | One dirty (but not quick) way is: |
Line 5: | Line 5: |
The following {{{sed}}} command line reads a file printing nothing (-n). At line $n the command "p" is run, printing it, with a "q" afterwards: quit the program. | {{{ sed -n ${n}p "$file" }}} But this reads the entire file even if only the third line is desired, which can be avoided by printing line {{{$n}}} using the "p" command, followed by a "q" to exit the script: |
Line 10: | Line 13: |
Another method is to grab the last line from a listing of the first {{{n}}} lines: | |
Line 11: | Line 15: |
Another way, more obvious to some, is to grab the last line from a listing of the first n lines: | |
Line 13: | Line 16: |
head -n $n $file | tail -n 1 | head -n $n $file | tail -n 1 }}} Another approach, using [[AWK]]: {{{ awk "NR==$n{print;exit}" file }}} If more than one line is needed, it's easy to adapt any of the previous methods: {{{ x=3 y=4 sed -n "$x,${y}p;${y}q;" "$file" # Print lines $x to $y; quit after $y. head -n $y "$file" | tail -n $((y - x + 1)) # Same head -n $y "$file" | tail -n +$x # If your tail supports it awk "NR>=$x{print} NR==$y{exit}" "$file" # Same }}} In Bash 4, a pure-bash solution can be achieved succinctly using the {{{mapfile}}} builtin. More than one line can be read into the array {{{MAPFILE}}} by adjusting the argument to mapfile's -n option: {{{ mapfile -ts $((n-1)) -n 1 < "$file" echo "${MAPFILE[0]}" }}} {{{mapfile}}} can also be used similarly to {{{head}}} while avoiding buffering issues in the event input is a pipe: {{{ { mapfile -n $n; head -n 1; } <"$file" |
Line 16: | Line 44: |
Using awk: {{{ awk 'NR==n{print;exit}' file }}} |
=== See Also === * [[BashFAQ/001]] * http://wiki.bash-hackers.org/commands/builtin/mapfile ---- CategoryShell |
How can I print the n'th line of a file?
One dirty (but not quick) way is:
sed -n ${n}p "$file"
But this reads the entire file even if only the third line is desired, which can be avoided by printing line $n using the "p" command, followed by a "q" to exit the script:
sed -n "$n{p;q;}" "$file"
Another method is to grab the last line from a listing of the first n lines:
head -n $n $file | tail -n 1
Another approach, using AWK:
awk "NR==$n{print;exit}" file
If more than one line is needed, it's easy to adapt any of the previous methods:
x=3 y=4 sed -n "$x,${y}p;${y}q;" "$file" # Print lines $x to $y; quit after $y. head -n $y "$file" | tail -n $((y - x + 1)) # Same head -n $y "$file" | tail -n +$x # If your tail supports it awk "NR>=$x{print} NR==$y{exit}" "$file" # Same
In Bash 4, a pure-bash solution can be achieved succinctly using the mapfile builtin. More than one line can be read into the array MAPFILE by adjusting the argument to mapfile's -n option:
mapfile -ts $((n-1)) -n 1 < "$file" echo "${MAPFILE[0]}"
mapfile can also be used similarly to head while avoiding buffering issues in the event input is a pipe:
{ mapfile -n $n; head -n 1; } <"$file"