2017-09-14 72 views
0

我想讀取長度爲2的數組中文件的最後兩行。如何在Bash中將文件的最後兩行讀入長度爲二的數組?

考慮文件a.txt

bar 
second line 
hello world 
foo bar fubar 

我試圖

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

但這會導致長度5的數組,每個包含一個字。我讀了Creating an array from a text file in Bash的帖子,但沒能從那裏讀到最後兩行。請注意,效率(執行時間)對我的需求至關重要。

我在Mac OS X上使用終端2.6.1

回答

2

您可以在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]}" 
+0

嗡嗡聲....我在MAC上使用終端版本2.6.1(信息編輯後)('GNU bash,版本3.2.57(1) - 釋放(x86_64-蘋果 - darwin15)')。不幸的是我沒有mapfile內置的。無論如何感謝 –

+0

@ Remi.b:檢查我的更新應該也適用於舊版本! – Inian

+2

@Remi。b:然後使用兩個'read'語句:'lines =(); {IFS =讀取-r'行[0]'; IFS =讀取-r'行[1]'; } <(尾部-n2文件)'。 –

0

嘗試以下一次,讓我知道,如果這可以幫助你。

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 
+0

'尾-2 .. |頭-1'是一種反模式!當你可以更直接地做。另外我看到沒有理由,你想存儲從索引'1'的值,當你可以從'0'做到這一點。 – Inian

+0

謝謝伊安,實際上爲什麼我做了尾巴-2 |頭-1試圖在OP的風格本身。是的,我們可以從數組[0]和數組[1]中完成,我只是給出示例,現在讓我來修復它。謝謝先生你在這裏指導:) – RavinderSingh13

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 
相關問題