各テキスト行をコンマで区切って配列に配置するにはどうすればよいですか?

各テキスト行をコンマで区切って配列に配置するにはどうすればよいですか?

テキストファイルがあり、次のように配列を作成したいと思います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使用すると、その行から配列が作成されます。filebash

結果を配列自体で望むのか、それとも表示中の配列のテキスト表現で欲しいのかは明確ではありません。

得るために特別な要求された出力:

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フィールドを割り当てたばかりの現在のレコードを表します。

おすすめ記事