Bash工具從文件獲取第n行

有沒有一種「規範」的方式來作到這一點? 我一直在使用head -n | tail -1 head -n | tail -1能夠達到目的,可是我一直在想是否有一個Bash工具專門從文件中提取一行(或一系列行)。 數組

「規範」是指一個程序,其主要功能就是這樣作。 bash


#1樓

# print line number 52
sed '52!d' file

sed有用的單行腳本 ide


#2樓

使用awk能夠很是快: 函數

awk 'NR == num_line' file

若是爲true,則執行awk的默認行爲: {print $0}工具


替代版本

若是您的文件碰巧很大,則最好在讀取所需行後exit 。 這樣能夠節省CPU時間。 ui

awk 'NR == num_line {print; exit}' file

若是要從bash變量中提供行號,能夠使用: spa

awk 'NR == n' n=$num file
awk -v n=$num 'NR == n' file   # equivalent

#3樓

這個問題被標記爲Bash,這是Bash(≥4)的處理方式:使用帶有-s (跳過)和-n (計數)選項的mapfileunix

若是您須要獲取文件file的第42行: code

mapfile -s 41 -n 1 ary < file

此時,您將擁有一個數組ary ,該數組的字段包含file行(包括結尾的換行符),在此咱們跳過了前41行( -s 41 ),並在讀取了一行( -n 1以後)中止了-n 1 )。 這就是第42行。 要打印出來: get

printf '%s' "${ary[0]}"

若是您須要必定範圍的行,請說範圍爲42–666(含),並說您不想本身作數學,並在stdout上打印它們:

mapfile -s $((42-1)) -n $((666-42+1)) ary < file
printf '%s' "${ary[@]}"

若是您也須要處理這些行,則存儲尾隨的換行符並非很方便。 在這種狀況下,請使用-t選項(修剪):

mapfile -t -s $((42-1)) -n $((666-42+1)) ary < file
# do stuff
printf '%s\n' "${ary[@]}"

您能夠使用一個函數爲您執行此操做:

print_file_range() {
    # $1-$2 is the range of file $3 to be printed to stdout
    local ary
    mapfile -s $(($1-1)) -n $(($2-$1+1)) ary < "$3"
    printf '%s' "${ary[@]}"
}

沒有外部命令,只有Bash內置函數!


#4樓

要使用帶有變量做爲行號的sed打印第n行:

a=4
sed -e $a'q:d' file

這裏的-e標誌用於將腳本添加到要執行的命令。


#5樓

對於大文件,最快的解決方案始終是tail | head,前提是兩個距離:

  • 從文件的開頭到起始行。 讓咱們稱之爲S
  • 從最後一行到文件末尾的距離。 成爲E

衆所周知。 而後,咱們能夠使用如下代碼:

mycount="$E"; (( E > S )) && mycount="+$S"
howmany="$(( endline - startline + 1 ))"
tail -n "$mycount"| head -n "$howmany"

多少隻是所需的行數。

https://unix.stackexchange.com/a/216614/79743中的更多詳細信息

相關文章
相關標籤/搜索