配列を構成してこの形式でファイルに書き込もうとします。つまり、ファイルの内容は次のようになります。
hero_pairscore=( askdjfh sdf,sdlkfj lksf,dfgdf,dsflkgj,asdlkf ....)
ここで要素はで区切りますcomma
。これを行うには、次のコードを書きました。
#!/bin/bash
#set -x
hero_pairscore=()
while read line
do
$( IFS=",";hero_pairscore+=( "$line" )
done < true_pairscore.txt
echo "hero_pairscore=( ${hero_pairscore[@]} )" > embed.txt
ただし、生成されたファイルにはこの内容のみが含まれていますhero_pairscore=( )
。私のコードには何の問題があり、必要な出力を提供するにはどうすればよいですか?
ベストアンサー1
ここでやるべきことは次のとおりです。
変数を設定します。私達はこれを使用します:
var="kijhg, fbjhku,,,ioy fbjfr, kjmyhg"
ファイル名拡張の設定
$IFS
と防止:IFS=, ; set -f
set
出力するシェル配列$@
。set -- $var
親シェル
$IFS
とシェルパラメータをリセットします。unset IFS ; set +f
長く生きる!複数の繰り返しや空白なども保存します!
printf %s\\n "$@"
出力
kijhg fbjhku ioy fbjfr kjmyhg
とにかく私の言葉を聞いてください。 a以外のすべての文字は,
保持されます。
切り替える
具体的には、bash配列の代わりに実際のシェル配列を使用することをお勧めします。なぜならすぐにスプリッタに変換できるからです。
printf %s "$*"
#OUTPUT#
kijhg fbjhku ioy fbjfr kjmyhg %
IFS=, ; printf %s "$*"
#OUTPUT#
kijhg, fbjhku,,,ioy fbjfr, kjmyhg
$*
最初の文字では、シェルの位置引数配列を分割する特別なPOSIX指定品質により、$IFS
大量のデータを簡単に変換できます。"quote"
パラメータ配列を保護しながら、必要な単一文字に分割できます。最初にちゃんとしたらいいです。
追加/プレフィックス
POSIXはまた、そのための特別な属性を指定します"$@"
。"$1"... eval "\${$#}"
各引数のアドレッシング形式に加えて、引数"$@"
(引用されている場合)はset
現在の値に関係なく最後の引数であるため、すべてのシェル引数に安全に拡張できます。$IFS.
したがって、配列の先頭にリストを追加するには、次のようにします。
set -- $list "$@"
頭部/尾方向:
set -- $head "$@" $tail
配列を3倍に増やすには:
set -- "$@" "$@" "$@"
現在の合計
データフローが非常に大きくない限り、次のタスクは現在のタスクより少し速くなる可能性があります。(ただし、ファイルを扱う場合は、シェルの分割を完全に避けるのが最善です):
( set -f -- ; IFS=, ; while read -r line ; do set -- "$@" $line ; done
printf %s "$*" ) | cat >out
たぶんTR?
しかし、私が理解していないことは - あなたは何をしていますか?改行文字をカンマに置き換えますか?私の言葉は -データはすでに改行文字以外にカンマで区切られていますか?もしそうなら、
tr '\n' ',' <in >out