2013-08-09 6 views
12

Ho una lista di numeri che voglio invertire.Come eseguire il retro di `xargs`?

Sono già ordinati.

35 53 102 342

voglio che questo:

342 102 53 35

Così ho pensato a questo:

echo $NUMBERS | ??? | tac | xargs

Qual è la cosa ???

Dovrebbe trasformare una lista separata da spazio in una lista separata dalla linea.

Vorrei evitare di dover impostare IFS.

Forse posso usare array bash, ma speravo ci sia un comando il cui scopo nella vita è quello di fare il contrario di xargs (forse xargs è più di un pony un trucco così !!)

risposta

16

Puoi utilizzare printf per quello. Per esempio:

$ 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. questo è ciò che chiamo una piacevole sorpresa. –

+3

Sarebbe meglio usare% s, in modo che non si interrompa se il numero contiene un punto decimale o è troppo grande. – mark4o

+0

@ mark4o: non ci avevo pensato affatto, grazie per il suggerimento. – Mat

3

Beh, si potrebbe scrivere:

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

dove printf '%s\n' ... stampe ciascuno di ..., con un ritorno a capo dopo ogni uno, e $(...) è una funzionalità incorporata che rende xargs quasi superfluo .

Tuttavia, non penso che dovresti evitare di utilizzare gli array, IFS e così via; rendono gli script più robusti di fronte a bug e/o input inaspettati.

5

Un'altra opzione è quella di utilizzare Bash string manipulation

$ numbers="35 53 102 342" 
$ echo "${numbers// /$'\n'}" 
35 
53 
102 
342 
$ echo "${numbers// /$'\n'}" | tac 
342 
102 
53 
35 
2

Se avete ordinato la vostra lista con sort, si potrebbe considerato l'-r invertito opzione

8

awk one-liner senza tac:

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

per esempio:

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

C'è un sacco di risposte utilizzando tac, ma nel caso in cui si desidera utilizzare sorta, è quasi la stessa:

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

n è importante, poiché rende sorta numericamente. r è inverso.

1

Un altro modo per cambiare lo spazio in nuove linee e viceversa è con tr:

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

Se i dati non sono ordinati, sostituire tac da sort -rn.

+0

Oh! intelligente ..... –

5

Un'altra risposta (facile da ricordare, ma non così rapidamente come il metodo printf):

$ xargs -n 1 echo 

esempio

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

Esattamente quello che mi serviva quando ho cercato il retro di xargs, grazie. Poiché "echo" è il comando standard usato da xargs, potresti persino ometterlo come "echo $ NUMBERS | xargs -n1 | tac | xargs' – Mitja