2013-08-09 9 views
12

Mam listę numerów, które chcę cofnąć.Jak wykonać odwrotność `xargs`?

Są już posortowane.

35 53 102 342

Chcę to:

342 102 53 35

Więc pomyślałem o tym:

echo $NUMBERS | ??? | tac | xargs

Co to jest ???

Powoduje, że lista oddzielana spacjami powinna być rozdzielana wierszami.

Chciałbym uniknąć konieczności ustawiania IFS.

Może mogę używać tablic bash, ale miałem nadzieję, że to polecenie, którego celem w życiu jest zrobić przeciwieństwo xargs (może xargs jest więcej niż kucyka Jeden trick jak dobrze !!)

Odpowiedz

16

Można użyj do tego celu printf. Na przykład:

$ printf "%s\n" 35 53 102 342 
35 
53 
102 
342 
$ printf "%s\n" 35 53 102 342|tac 
342 
102 
53 
35 
+2

Wow. to jest to, co nazywam miłym zaskoczeniem. –

+3

Byłoby lepiej użyć% s, aby nie złamać, jeśli liczba zawiera przecinek dziesiętny lub jest zbyt duża. – mark4o

+0

@ mark4o: nie myślałem o tym w ogóle, dzięki za napiwek. – Mat

3

Cóż, można napisać:

echo $(printf '%s\n' $NUMBERS | tac) 

gdzie printf '%s\n' ... drukuje każdy z ..., z nowej linii po każdym z nich, a $(...) jest wbudowana funkcja sprawia, że ​​xargs niemal zbędny .

Jednak nie sądzę, że powinieneś unikać używania tablic, IFS, i tak dalej; sprawiają, że skrypty są bardziej odporne na błędy i/lub nieoczekiwane dane wejściowe.

2

Jeśli posortowane listy z sort, może być uważany za -r odwróconą opcji

8

awk jedną wykładzinę bez tac:

awk '{NF++;while(NF-->1)print $NF}' 

na przykład:

kent$ echo "35 53 102 342"|awk '{NF++;while(NF-->1)print $NF}' 
342 
102 
53 
35 
3

Jest wiele odpowiedzi korzystających tac, ale w przypadku chcesz użyć sortowania, to prawie to samo:

printf "%s\n" 1 2 3 4 5 10 12 | sort -rn 

n jest ważna, gdyż sprawia, że ​​sortowanie numerycznie. r jest odwrotnie.

1

Innym sposobem na zmianę miejsca w nowej linii i na odwrót jest z tr:

echo 35 53 102 342|tr ' ' '\n'|tac|tr '\n' ' ' 

Jeśli dane nie są sortowane, zastąpić tac przez sort -rn.

+0

Oh! sprytny ..... –

5

Inna odpowiedź (łatwe do zapamiętania, ale nie tak szybko, jak metoda printf):

$ xargs -n 1 echo 

np

$ NUMBERS="35 53 102 342" 
$ echo $NUMBERS | xargs -n 1 echo | tac | xargs 
342 102 53 35 
+0

Dokładnie to, czego potrzebowałem, gdy szukałem odwrotności xargs, dzięki. Ponieważ 'echo' jest standardowym poleceniem używanym przez xargs, możesz nawet pominąć to jak' echo $ NUMBERS | xargs -n1 | tac | xargs' – Mitja