2017-09-14 10 views
0

ファイルの最後の2行を長さ2の配列で読み込もうとしています。ファイルの最後の2行をBashの長さ2の配列に読み込む方法は?

ファイルa.txt

bar 
second line 
hello world 
foo bar fubar 

を考えるIは

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

を試みたが、これは、それぞれが単一の単語を含む、長さ5の配列をもたらします。私は投稿Creating an array from a text file in Bashを読むが、そこから最後の2行だけを読むことに失敗する。効率(実行時間)は私のニーズにとって重要であることに注意してください。

私はかつて、次の試してみて、これがあなたを助けている場合、私に知らせて、ターミナル2.6.1

答えて

2

このためbashmapfileコマンドを使用することができます。配列

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

でジャストtail最後の2行とそれらを格納は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

Hum ....私はMAC上でTerminal version 2.6.1(情報が投稿時に編集されています)( 'GNU bash、version 3.2.57(1)-release(x86_64-apple- darwin15) ')。残念ながら、私はmapfileを組み込んでいません。とにかくありがとう –

+0

@ Remi.b:古いバージョンでも動作するはずのアップデートをチェックしてください! @ Reim。 – Inian

+2

b:2つの 'read'文を使います:' lines =(); {IFS =読み取り-r '行[0]'; IFS =読み取り-r '行[1]'; } <(テール-n2ファイル) '。 –

0

を使ってMac OS Xにしています。

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はアンチパターンのビットです!より直接的に行うことができます。また、 '0'から行うことができるときにインデックス' 1'の値を保存したい理由はありません。 – Inian

+0

ありがとうございました。ヘッド-1はOPのスタイル自体でやろうとしました。はい、私たちは配列[0]と配列[1]からできました、私は単に例を与えました。 – RavinderSingh13

0

このように使用できます。

01あなたは mapfileを持っていない場合

は、あなたの配列を埋めるために、このwhileループを使用します。

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

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

出力:

hello world 
foo bar fubar 
関連する問題