Sắp xếp số trong tệp được phân cách bằng dấu phẩy với Unix


8

Tôi đã có một tệp được phân tách bằng dấu phẩy trông như thế này:

100,00869184
6492,8361
1234,31
200,04071

Tôi muốn sử dụng sortđể sắp xếp tệp này theo số lượng theo cột đầu tiên .

Kết quả như ý:

100,00869184
200,04071
1234,31
6492,8361

Làm thế nào để tôi đạt được điều này bằng cách sử dụng sắp xếp? Có vẻ như dấu phẩy đang được đối xử như hàng ngàn dấu phân cách thay vì dấu phân cách ngay cả khi tôi gọi chúng như vậy.

Cả hai sort -t',' -nsort -t',' -nk1'cho tôi cái này:

1234,31
200,04071
6492,8361
100,00869184

Sắp xếp theo mặc định (không có tham số) hoặc sử dụng sort -t','cho tôi điều này:

100,00869184
1234,31
200,04071
6492,8361

Và sắp xếp như một con số sort -ncho tôi điều này:

1234,31
200,04071
6492,8361
100,00869184

Làm thế nào tôi có thể sử dụng sắp xếp để đạt được kết quả mong muốn của tôi?

Chỉnh sửa để thêm: Đây là hoạt động một lần để tạo danh sách sắp xếp khoảng 7 triệu dòng, vì vậy cách giải quyết hoặc các phương pháp không chính thống khác là hoàn toàn chấp nhận được.


các ví dụ tôi thấy ở đây dường như hiển thị -ttùy chọn có khoảng cách giữa -tnhân vật và nhân vật
SeanC

Suy nghĩ đầu tiên - sử dụng cắt. Nó chỉ chọn một cột cụ thể, dựa trên một dấu phân cách nhất định. Ngoài ra câu trả lời của "Ice Ice" với tr. Tôi yêu tr. Tôi quá lười để viết và kiểm tra điều này, mặc dù. Chúc mừng!
Vorac

Có thể tương tự cho tab char: stackoverflow.com/questions/1037365/
Thẻ

Câu trả lời:


9

Đây chắc chắn là một cách giải quyết bẩn thỉu, nhưng tôi đã tìm ra cách để làm điều này nhờ vào mẹo của @ slhck về các địa phương. Nếu một câu trả lời tốt hơn xuất hiện sẽ hữu ích hơn cho người khác, tôi chắc chắn sẽ chấp nhận nó vì điều này khá nhiều chỉ hoạt động cho vấn đề cụ thể của tôi.

Tôi đặt ngôn ngữ thành tiếng Tây Ban Nha (Bolivian) để dấu phẩy được coi như dấu thập phân, sau đó sắp xếp số chuẩn đã thực hiện thủ thuật.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361

Ah thấy, tôi đã đề nghị sử dụng một ngôn ngữ Đức hoặc tương tự. Không thể nghĩ ra bất cứ điều gì khác ngay bây giờ mà không thể kiểm tra nó hoặc công cụ nào bạn có sẵn, vì đây là phiên bản Unix khá hiếm.
slhck

@slhck Đó dường như là mấu chốt của hầu hết các vấn đề tôi gặp phải trong UNIX :) Cảm ơn sự giúp đỡ của bạn trong việc đưa tôi đến một giải pháp, bất kể.
dpatchery

6

GNU sortlàm điều này theo mặc định:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Phiên bản:

$ gsort --version
sort (GNU coreutils) 8.19

Mặc dù có một cảnh báo: Nếu việc sắp xếp của bạn không hoạt động như mong đợi, thì localecó lẽ bạn được đặt thành một cái gì đó khác với C. Tại sao lại thế này? localeđịnh nghĩa sắp xếp và giải thích các chữ cái, số, ký tự thập phân et cetera.

Để kiểm tra điều này, chỉ cần nhập localevào Terminal. Được LC_NUMERICthiết lập en_US.UTF-8, có thể? Điều này sẽ giải thích thứ tự sắp xếp sai. Đặt nó trở lại C:

export LC_NUMERIC=C

Sau đó, thử lại sortlệnh của bạn . Nếu bạn muốn đặt toàn cầu của mình localethành C, hãy làm điều này với:

export LC_ALL=C

Tôi không có quyền truy cập GNU trong môi trường của mình. Nó có phải là thứ tôi có thể dễ dàng lấy sau đó gỡ bỏ không? HMU trong trò chuyện nếu ai đó muốn giúp tôi làm điều này ... Tôi khá là người mới UNIX.
dpatchery

Tôi khá chắc chắn rằng đó chỉ là một localevấn đề. Nhưng những gì sort --versioncho bạn, thực sự?
slhck

sắp xếp - đảo ngược cho tôi một cuộc tranh cãi bất hợp pháp. --các lệnh đã không làm việc cho tôi trong quá khứ. Tôi đã kiểm tra trang người đàn ông và không có phiên bản nào được gọi rõ ràng, nhưng nó liệt kê "HP-UX 11i Phiên bản 2: Tháng 8 năm 2003" nếu điều đó có ích gì cả. LC_NUMERIC của tôi được đặt thành "C".
dpatchery

Ví dụ, ngôn ngữ Đức sẽ sử dụng ,như một dấu tách thập phân. Tôi chưa bao giờ sử dụng HP-UX.
slhck

1

Hãy thử thêm -gtùy chọn giả sử để thực hiện sắp xếp số.

Thử:

sort -t',' -g <whatever>

Không phải là -nsắp xếp số? -g cho tôi một lựa chọn bất hợp pháp.
dpatchery

-ggeneral-numeric-sorttùy chọn và thực sự nên có sẵn trong bất kỳ phiên bản gần đây nào của sort. @dpatchery
slhck

Đây là nơi làm việc của tôi vì vậy tôi gần như chắc chắn không có phiên bản gần đây :)
dpatchery

0

Thay thế đồng hồ đo:

cat commafile | tr , " " | sort -n 

- nên giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.