テキストファイルの他の行を別の変数として読みたいです。例えば
input.txt
:
line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
この結果を次のように変数に保存したいと思いますvar1
。var2
var3
var4
var1=line1 foo foobar bar
var2=line2 bar
など。
誰かがそれがどのように完了したかを教えてもらえますか?eval
forループで試してみました。これはうまくいかないようです。
答え1
あなたはこれを行います:
unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt
または:
{ line1=$(line) && line2=$(line); } < input.txt
(line
組み込み機能がほとんどなく、ほとんどのシェルでコマンド置換を実装するためにフォークが必要であるため、効率が低下します。これは標準コマンドではline
ありません)。
ループを使用してください。
unset -v line1 line2 line3
for var in line1 line2 line3; do
IFS= read -r "$var" || break
done < input.txt
または、変数名を次のように自動的に定義しますline<++n>
。
n=1; while IFS= read -r "line$n"; do
n=$((n + 1))
done < input.txt
bash
行を配列に読み込むための配列変数と組み込みreadarray
関数がサポートされています。
readarray -t line < input.txt
しかし、他のほとんどのシェルとは異なり、配列インデックスbash
は1ではなく0から始まるので(から継承されます)、最初の行は代わりにありますksh
(たとえ${line[0]}
${line[1]}
@Costasが示すように、インデックス1に値の書き込みを開始させることができますreadarray
(配列は他のほとんどのシェルの場合とは反対です)。mapfile
bash
足りない配列)と-O 1
)。
また見なさい:「IFS=read -r line」を理解しましたか?
答え2
これらのタスクには配列を使用することをお勧めします
mapfile -t -O 1 var <input.txt
だからあなたは各行などを得る${var[1]}
でしょ${var[2]}
う
答え3
これはあなたが要求するものを厳密に言う必要はありませんが、あなたのニーズに適している可能性があります。 awkを使用してデータをシリアル化できます。 $ 1が有効な変数名ではない場合、これは中止されます。
awk '
function quote(str, d, m, x, y, z) {
d = "\47"; m = split(str, x, d)
for (y in x) z = z d x[y] (y < m ? d "\\" d : d)
return z
}
{
print $1 "=" quote($0)
}
' input.txt > /tmp/input.sh
. /tmp/input.sh
結果:
$ echo "$line1"
line1 foo foobar bar