2013-08-09 37 views
12

Tôi có một danh sách các số mà tôi muốn đảo ngược.Cách thực hiện đảo ngược `xargs`?

Chúng đã được sắp xếp.

35 53 102 342

Tôi muốn điều này:

342 102 53 35

Vì vậy, tôi nghĩ về điều này:

echo $NUMBERS | ??? | tac | xargs

là gì ???

Nó sẽ biến danh sách được phân cách bằng dấu cách thành danh sách được phân tách bằng đường kẻ.

Tôi muốn tránh phải đặt IFS.

Có lẽ tôi có thể sử dụng các mảng bash, nhưng tôi đã hy vọng có một lệnh mục đích mà trong cuộc sống là để làm điều ngược lại của xargs (có thể xargs là nhiều hơn một con ngựa một trick cũng !!)

Trả lời

16

Bạn có thể sử dụng printf cho điều đó. Ví dụ:

$ 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. đó là điều tôi gọi là một bất ngờ thú vị. –

+3

Sẽ tốt hơn nếu sử dụng% s, để nó không bị hỏng nếu số có dấu thập phân hoặc quá lớn. – mark4o

+0

@ mark4o: đã không nghĩ về điều đó chút nào, cảm ơn mẹo. – Mat

3

Vâng, bạn có thể viết:

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

nơi printf '%s\n' ... in mỗi ..., với một dòng mới sau mỗi lần một, và $(...) là một built-in tính năng mà làm cho xargs gần như không cần thiết .

Tuy nhiên, tôi không nghĩ bạn nên tránh sử dụng mảng, IFS, v.v. chúng làm cho các kịch bản mạnh mẽ hơn khi đối mặt với các lỗi và/hoặc đầu vào bất ngờ.

5

Một lựa chọn khác là sử dụng Bash string manipulation

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

Nếu bạn đã sắp xếp danh sách của bạn với sort, bạn có thể coi là -r đảo ngược lựa chọn

8

awk một lót mà không tac:

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

ví dụ:

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

Có rất nhiều câu trả lời bằng tac, nhưng trong trường hợp bạn muốn sử dụng sắp xếp, nó gần như giống nhau:

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

n là quan trọng vì nó làm cho nó loại số lượng. r bị đảo ngược.

1

Một cách khác để thay đổi không gian vào dòng mới và theo chiều ngược lại là với tr:

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

Nếu dữ liệu không được sắp xếp, thay thế tac bởi sort -rn.

+0

Ồ! thông minh ..... –

5

câu trả lời khác (dễ nhớ nhưng không nhanh như các phương pháp printf):

$ xargs -n 1 echo 

ví dụ

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

Chính xác những gì tôi cần khi tôi tìm kiếm đảo ngược của xargs, cảm ơn. Vì 'echo' là lệnh chuẩn được sử dụng bởi xargs, bạn thậm chí có thể bỏ qua nó như' echo $ NUMBERS | xargs -n1 | tac | xargs' – Mitja