テキストファイルを読み取り、それに基づいてJSONキーと値のペアを作成するシェルスクリプトをコーディングしています。key
ファイル名で、value
ファイルのランダムなラインです。
問題は、グローバル変数のkey
とを連結するときvalue
ですdata
。
次のコードを実行すると:
data='{'
for file in $(ls _params)
do
key=${file%.txt}
f_line=$(($$%100))
value=$(sed "${f_line}q;d" "./_params/$file")
# assembles key-value pairs
data=$data\"$key\":\""value"\",
done
data=${data%?} # removes last comma
data="$data}"
echo $data
私の出力は次のとおりです。 {"firstName":"value","lastName":"value"}
ただし、次のように、文字列"value"
を変数に変更$value
します。
data='{'
for file in $(ls _params)
do
key=${file%.txt}
f_line=$(($$%100))
value=$(sed "${f_line}q;d" "./_params/$file")
# assembles key-value pairs
data=$data\"$key\":\"$value\",
done
data=${data%?} # removes last comma
data="$data}"
echo $data
出力が混乱します:"}"lastName":"Adailee
。
$data
次のような変数に格納したいと思います。{"firstName":"Bettye","lastName":"Allison"}
注:私のbashバージョンは4.3.48です。
注:アーカイブ内_params
には2つのファイルがfirstName.txt
あり、lastName.txt
どちらも各行にランダムな名前が付いています。
@ruakhが示唆しているように、特定の問題は入力ファイルです。問題を再現してこれを確認する手順は次のとおりです。
ABCDを100回繰り返したfirstNames.txtファイルを2つ作成しました。
$ cat ABCD
A
B
C
D
$ for _ in $(seq 1 100); do cat ABCD >> _params/firstName.txt
そして、lastNames.txtのWXYZと同様です。次に、スクリプトを実行しました。
$ bash q.sh
{"firstName":"A","lastName":"W"
ただし、unix2dos
(dos2unixパッケージから)これを\ r \ n行末に変換するために使用する場合。
$ unix2dos _params/firstName.txt
unix2dos: converting file _params/firstName.txt to DOS format...
$ unix2dos _params/lastName.txt
unix2dos: converting file _params/lastName.txt to DOS format...
$ bash q.sh
"}"lastName":"W
したがって、おそらくdos2unix
入力ファイルを修正するために使用できます(または開いvim
て実行:set ft=unix
してから:x
)。
しかし、私はあなたに他の3つのことについて知らせたかったのです。
ls
ではなく、代わりにglobbingを使用することです1スクリプトを改善するための私の提案は次のとおりです(入力の改行を修正したら):
#!/bin/bash
data='{'
sep=""
for file in _params/*
do
key=${file%.txt}
file_length=$(wc -l < ${file})
f_line=$(( (RANDOM % file_length) + 1 ))
value=$(sed "${f_line}q;d" "${file}")
# assembles key-value pairs
data="${data}${sep} \"$key\":\"$value\""
sep=","
done
data="${data} }"
echo $data
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加