2017-02-17 5 views
1

ループ内に構築する配列からTSVファイルを作成しようとしています。私は各行の値をタブで区切るようにしていますが、配列の各要素を新しい行にエクスポートすることはできません。これは一例です:bash - 新しい行に各配列要素を出力する

OUTPUT=() 
#header 
OUTPUT+=$(printf "col_1\tcol_2\tcol_3") 

param_1="bla" 
param_2="tra" 
param_3="meh" 

for i in 1 .. 3 
    do 
    OUTPUT+=$(printf "$param_1\t$param_2\t$param_3") 
done 
#export 
printf '%s\n' "${OUTPUT[@]}" > test.tsv 

私も、私は、配列に挿入する各文字列の末尾に\nを入れて試してみましたが、それはうまくいきませんでした。私が間違って何をしているのか?あなたはこの構文を使用する必要があり、アレイに追加する

+1

ファイルで終わるために起こっている場合、中間アレイ層を持っている必要はありません、あなたは直接ファイルに要素を書き込むことができます。飛行中のファイルが表示されないようにするには、一時ファイルを使用して最後の最後のファイル名に移動します。 – karakfa

+1

はい、今後スクリプトを使用する予定の場合、これはファイルに書き込む方法ではありません(ただし、可能ですが)。データの操作(およびファイルの読み書き)用に設計されたツールを習得するのに時間を費やすことをお勧めします。 [awk tutorial](http://grymoire.com/Unix/awk.html)をチェックするか、無制限のコントロールとシステム機能、OOなどが必要な場合は、あなたのために働くpythonまたはperlチュートリアルを見つけてください。がんばろう。 – shellter

+0

@karakfa私は一時ファイルを使用することを避け、その中のすべての反復で書きます。なぜかバッファリングされていても、出力が半分のMBを超えない場合でも。私は最後に一度だけ出力することはできますか?あなたのコメントのために – Marius

答えて

2

ありがとう:

array+=(content) 

また、静的なテキストを追加するためprintfを使用する必要はありません。

OUTPUT=() 
#header 
OUTPUT+=("col_1\tcol_2\tcol_3") 

param_1="bla" 
param_2="tra" 
param_3="meh" 

for i in {1..3} 
do 
    OUTPUT+=("$param_1\t$param_2\t$param_3") 
done 
#export 
printf '%b\n' "${OUTPUT[@]}" > test.tsv 

printf%bの注意使用ので、エスケープシーケンスが正しく解釈されます。ここでは

は、作業スクリプトです。

出力:

cat test.tsv 

col_1 col_2 col_3 
bla  tra  meh 
bla  tra  meh 
bla  tra  meh 
+1

こんにちは。答えをありがとう。それは今働く。つまり、実際に違いを生むのは、ファイルへの 'printf'のエクスポートで、すべてのエスケープ文字を展開するバイナリへの変換、'%b'です。配列に要素を追加するときに 'printf'を使わずに前に試しましたが、' \ t'ですべての文字列を出力します。もう一度ありがとう – Marius

関連する問題