2011-01-25 9 views
7

Mam tablicę wartości $dates że jestem przekształcając:UNIX funkcja map

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

Czy istnieje sposób, aby zapisać wynik tej operacji, więc mogę rura go do czegoś innego bez zapisywania go do plik na dysku?

+2

Czy jesteś ograniczony do basha? Jeśli nie, polecam zrobić to w Perlu ... mapa jest częścią pakietu. – DVK

+0

Jak duża jest twoja tablica? 10s, 100s, 1000s, większy? Dlaczego nie można zapisać na dysku? Czy możesz zatrzymać wyniki w innej tablicy? Dlaczego nie? –

+0

Czy Twoja wersja 'date' obsługuje' date -d "@ $ i" '+% a_% D''? –

Odpowiedz

6

Utwórz funkcję:

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

Wtedy można na przykład wysłać wyjście do standardowego błędu:

echo `foo $dates` >&2 
+0

Co sprawia, że ​​wysyłanie danych wyjściowych do standardowego błędu? Można to zrobić bez funkcji: 'for ... done> & 2'. –

+0

@Denis Williamson: Nie chodzi o wysyłanie danych wyjściowych do stderr; to był tylko przykład wykorzystania tej funkcji. Chodzi o to, aby móc przechwytywać dane wyjściowe bez zakłócania długich wyrażeń, takich jak '$ (dla i w datach $, do daty -d" @ $ i "'+% a_% D', done)' przez cały czas. – Oswald

+0

Otaczające '$ (...)' nie są konieczne. Możesz potoczyć całe 'for', jak pokazał Dennis. Jak w 'for ... done | 2nd-command'. – Adrian

2

Można napisać do FIFO - "nazwanego potoku", który wygląda jak plik.

Wikipedia ma godnej przykład użycia: http://en.wikipedia.org/wiki/Named_pipe

+0

Nazwane rury są naprawdę interesujące, dzięki! Wciąż jednak dochodzę do impasu. Potrzebujesz dowiedzieć się więcej na ich temat. – pokerface

3

Twoje pytanie jest nieco niejasne, ale mogą działać następujące:

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

Edit, nie widzi całość pliku:

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

Wymieniona operacja, która nie chce zapisać danych do pliku. –

+0

Odpowiedź 2 z pojedynczym przekierowaniem We/Wy powinno być używane zamiast polecenia "dołącz do polecenia" w odpowiedzi 1. –

1

Jeśli używasz bash, można użyć tablicy:

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

Następnie można echo/potokować tę tablicę do innego programu. Zauważ, że tablice są specyficzne dla basha, co oznacza, że ​​nie jest to rozwiązanie przenośne (no, poza systemami, które mają bash).

+0

Nie musisz uciekać od cudzysłowu wewnątrz '$()'. Są oceniane osobno od tych na zewnątrz. W rzeczywistości w tym przypadku nie zadziała. Możesz zrobić 'tablica + = (element)' i nie musisz śledzić zmiennej indeksowej. –

+0

Tablice istnieją w większości powłok i były najpierw w csh, z prawie taką samą składnią ('set DATEARRAY [q] = ...'). –

+0

@Dennis - Dzięki, dodałem je jako dodatkową myśl. @Charles, nie sądzę, że istnieją w myślniku, ksh, pdksh lub busybox (co jest w zasadzie dash iirc), stąd ostrzeżenie o przenośności. Starałem się wiedzieć, że najpierw były one w csh, których nie mogę używać _nie wystarczająco_ :) –

11

Skoro mówisz „przekształcenie” Jestem przy założeniu, to znaczy, że chcesz przechwycić wyjście z pętli w zmiennej. Można nawet zastąpić zawartość zmiennej $dates.

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

Zainspirował mnie ten i użyłem 'błogosławić $ (dla mnie w {0..127}; zrobić printf '0x% 06x' $ (($ i * 0x4000)); zrobić)' aby otworzyć wiele plików '0x000000, 0x004000 , 0x008000, 0x00c000, 0x010000, 0x014000, ... 'od razu w logicznej kolejności. –