2011-01-25 12 views
7

私は変革だ値$datesの配列を持っている: UNIXマップ機能

for i in $dates 
do 
    date -d "1970-01-01 $i sec UTC" '+%a_%D' 
done 

ので、私が何かにパイプそれをすることができます。この操作の結果を保存する方法が他にそれを記述することなくありますディスク上のファイル?

+2

bashに制限されていますか?そうでなければ、私はPerlでこれを行うことをお勧めします...地図はパッケージの一部として提供されます。 – DVK

+0

あなたの配列はどれくらい大きいですか? 10代、100代、1000代、それ以上?なぜディスクに書き込めないのですか?あなたは別の配列で結果を保持できますか?何故なの? –

+0

あなたの 'date'のバージョンは' date -d "@ $ i" '+%a_%D''をサポートしていますか? –

答えて

6

関数を作成します:

foo() { 
     for i in [email protected] 
     do 
       date -d "1970-01-01 $i sec UTC" '+%a_%D' 
     done 
} 

その後、あなたは、例えばすることができます

echo `foo $dates` >&2 
+0

出力を標準エラーに送信すると、あなたは何をしますか?あなたは関数なしでそれを行うことができます: 'for ... done>&2'。 –

+0

@Dennis Williamson:出力をstderrに送るのではなく、これは関数の使い方の一例にすぎません。それは、 '$($ dateのiの場合は、; -d" @ $ i "'+%a_%D'; done)'のような長い式を邪魔することなく出力をキャプチャすることができます。 – Oswald

+0

'$(...)'は必要ありません。 Dennisが示したように 'for 'の全体をパイプすることができます。 'for ... done |のように。 2番目のコマンドを実行します。 – Adrian

2

ファイルに似た「名前付きパイプ」をFIFOに書き込むことができます。

ウィキペディアは、その使用のまともな例があります:http://en.wikipedia.org/wiki/Named_pipe

+0

名前付きパイプは本当に面白いです、ありがとう!私はデッドロックを起こし続けます。それらについてもっと知る必要があります。 – pokerface

3

あなたの質問は少しあいまいですが、以下は動作可能性があります

for ... 
do 
... 
done | ... 
1

編集、ファイル全体の事見ませんでした。

for i in $dates ; do 
    date -d "1970-01-01 $i sec UTC" '+%a_%D' 
done |foo 
+0

opは、特にデータをファイルに書きたくないと述べています。 –

+0

Answer 1のコマンドではなく、単一のI/Oリダイレクションを使用する回答2を使用する必要があります。 –

1

のbashを使用している場合は、配列を使用できます。

q=0 
for i in $dates 
do 
    DATEARRAY[q]="$(date -d "1970-01-01 $i sec UTC" '+%a_%D')" 
    let "q += 1" 
done 

そのアレイを別のプログラムにエコー/パイプすることができます。配列はbash固有であることに注意してください。これは、移植可能ではないことを意味します(もちろん、bashを持つシステムを超えています)。

+0

'$()'の中で引用符をエスケープする必要はありません。彼らは外部のものとは別に評価されます。実際、この場合は動作しません。あなたは 'array + =(element)'を実行することができ、インデックス変数を追跡する必要はありません。 –

+0

配列はほとんどのシェルにあり、最初はcshにあり、ほとんど同じ構文です( 'set DATEARRAY [q] = ...')。 –

+0

@Dennis - ありがとう、私は実際にそれらを補足として追加しました。 @Charles、私は彼らがダッシュ、ksh、pdkshまたはbusybox(これは基本的にダッシュiircです)に存在するとは思わないので、移植性に関する警告です。彼らがcshで最初にあったことを知っていて、私は十分に使用することができません。 –

11

「変換する」と言っているので、私はあなたが変数のループの出力を取り込むことを意味していると仮定しています。変数$datesの内容を置き換えることもできます。

dates=$(for i in $dates; do date -d "@$i" '+%a_%D'; done) 
+0

私はこれに触発され、 'bless $を使用しました。(0..127ではi)、printf '0x%06x' $(($ i * 0x4000)); done)' '多くのファイルを開く' '0x000000、0x004000 、0x008000、0x00c000、0x010000、0x014000、...を一度に論理的な順序で含む。 –

関連する問題