如何将文件的最后两行读入Bash中长度为2的数组?

How to read the last two lines of a file into an array of length two in Bash?

我正在尝试读取长度为 2 的数组中文件的最后两行。

考虑文件 a.txt

bar
second line
hello world
foo bar fubar

我试过了

lines=($(tail -n 2 a.txt))

但这会产生一个长度为 5 的数组,每个数组包含一个单词。我读了 post 但没能从那里读到最后两行。请注意,效率(执行时间)对我的需求很重要。

我正在 Mac OS X 使用终端 2.6.1

尝试关注一次,如果这对您有帮助,请告诉我。

array[0]=$(tail -2 Input_file | head -1)
array[1]=$(tail -1 Input_file)

输出如下。

echo ${array[0]}
hello world
echo ${array[1]}
foo bar fubar

为此,您可以使用 bash 中的 mapfile 命令。只需 tail 最后 2 行并将它们存储在数组中

mapfile -t myArray < <(tail -n 2 file)
printf "%s\n" "${myArray[0]}"
hello world
printf "%s\n" "${myArray[1]}"
foo bar fubar

查看有关 mapfile builtin 和可用选项的更多信息。


如果 mapfile 由于一些旧版本的 bash 而无法使用,您可以只使用 read 命令和下面的过程替换

myArray=()
while IFS= read -r line
do 
    myArray+=("$line") 
done < <(tail -n 2 file)

并像以前一样打印数组元素

printf "%s\n" "${myArray[0]}"

你可以这样使用它:

# read file in an array
mapfile -t ary < file

# slice last 2 elements
printf '%s\n' "${ary[@]: -2}"

如果你没有 mapfile 然后使用这个 while 循环来填充你的数组:

ary=()
while read -r; do
   ary+=("$REPLY")
done < file

printf '%s\n' "${ary[@]: -2}"

输出:

hello world
foo bar fubar