bashで文字列を連結する

プログラムの出力は、ファイル内の各行に1つずつ、小数点以下2桁の浮動小数点数に設定されています。実行に応じて、それぞれがファイル名cancer.ex#を持つ多くのファイルを出力できます。ここで、#はプログラムがスクリプトから実行された回数です。

教授は、gnuplotを使って95%信頼グラフを生成するための最初のステップとしてawkスクリプトを提供しました。出力をフォーマットに変換したい

conf $ 1 $ 2 $ 3 var#

#は、cancer.ex#の番号です。

私は以下を開発しました:

#!/bin/bash
Files=Output/*
String

for f in $Files 
do
    String="conf "
    cat $f | while read LINE
    do
        String="$LINE "
    done
echo $String
done

私はちょうどこれをまとめるようになったので、いくつかのステップが欠落していることを知っています。私の問題は、単に動作しないので、連結部分を実行しています。上記のスクリプトを実行すると、出力はありません。しかし、 String = "$ LINEecho $ LINE に変更すると、端末に置かれたファイルの出力がすべて取得されます。

bashのループ内の変数に実行可能な追加機能がありますか?

5

1 答え

#!/bin/bash
Files=( 出力/* )
String

for f in "${Files[@]}"
do
    String="conf "
    while read LINE
    do
        String+="$LINE "
    done < "$f"
echo $String
done

The subtle difference with < "$f" instead of piping cat $f is mainly, that the while loop would execute in a subshell due the pipe, and the variable in the for loop would not actually be updated because of the subshell.

また、さまざまな点でファイル名の扱いをより堅牢にした(ファイル名にスペースを入れるなど)

箱から?

それはすべて、私はあなたが単に

String="conf $(cat 出力/*)"
#
String="$(for a in 出力/*; do echo "conf $(cat "$a")"; done)"

ダミーデータによる概念の証明:

mkdir Dummy
for a in {a..f}; do for b in {1..3}; do echo $a $b; done > Dummy/$a; done
for a in Dummy/*; do echo "conf " $(cat $a); done

出力

conf  a 1 a 2 a 3
conf  b 1 b 2 b 3
conf  c 1 c 2 c 3
conf  d 1 d 2 d 3
conf  e 1 e 2 e 3
conf  f 1 f 2 f 3
7
追加された
それは、大変ありがとうございました。私は堅牢性を含めて覚えていますが、ハードコーディングされた実装のためにこの特定のスクリプトには必要ではありません。
追加された 著者 Jason,
@ジェイソン:私は(3回目の読書で...)あなたが行うことを試みているものに最適なワンライナーのバージョンを含めて、同様にサンプル出力と:)
追加された 著者 sehe,