テキストファイルがあり、次のように配列を作成したいと思いますarray=["line1","line2",...]
。
これは私のテキストの最初の行です。
Hamlet
William Shakespeare
Edited Barbara B Mowat Paul Werstine
Michael Poston Rebecca Niles
Folger Shakespeare Library
httpwwwfolgerdigitaltextsorgchapter5playHam
Created Jul 31 2015 FDT version 092
Characters Play
line 17 POLONIUS father Ophelia Laertes councillor King Claudiusthis line substituted
GHOST
出力は次の形式でなければなりません。
lines=["Hamlet"
,"William Shakespeare"
,"Edited Barbara B Mowat Paul Werstine "
,"Michael Poston Rebecca Niles"
,"Folger Shakespeare Library"
,"httpwwwfolgerdigitaltextsorgchapter5playHam"
,"Created Jul 31 2015 FDT version 092"
,"Characters Play"
,"line 17 POLONIUS father Ophelia Laertes councillor King Claudiusthis line substituted","GHOST"]
ベストアンサー1
ファイルに空白行が含まれていないとします。
mapfile -t array <file
各読み取り行から-t
改行文字を削除します。array
使用すると、その行から配列が作成されます。file
bash
結果を配列自体で望むのか、それとも表示中の配列のテキスト表現で欲しいのかは明確ではありません。
得るために特別な要求された出力:
mapfile -t array <file
printf '"%s"\n' "${array[@]}" | { mapfile -t arr; IFS=','; printf 'lines=[%s]\n' "${arr[*]}"; }
これにより、以前と同様に行が配列に読み込まれますarray
。次のprintf
ステートメントは、配列の各要素の周りに二重引用符を追加し、それを新しいコマンドに送信して、変更されたmapfile
データを新しい一時配列に読み込みますarr
。配列は、printf
二重引用符で囲まれた要素の間にカンマを挿入して、要求された方法でその要素をフォーマットするステートメントで使用されます。
代わりに使用してくださいawk
(シェル配列に行をまったく保存しないでください)。
awk -v OFS=',' '
{ line[NR] = $0 }
END {
for (i=1; i<=NR; ++i)
$i = "\"" line[i] "\""
printf("lines=[%s]\n", $0);
}' file
その後、各行をawk
配列として読み込みます。最後に、要素に二重引用符を追加し、それを出力フィールドに割り当てます(ループ内for
)。このprintf
ステートメントは、シェルコードの例とほぼ同じ方法で出力形式を指定します。 $0
フィールドを割り当てたばかりの現在のレコードを表します。