Sắp xếp nhiều tệp với bash


1

Tôi có một câu hỏi liên quan đến ngôn ngữ bash scripting.

Tôi có nhiều thư mục

  • /studentName
  • /studentMail
  • /studentNumber

Trong mỗi một trong các thư mục là một tập tin name.txt, mail.txt, number.txt.

Bây giờ tôi cần tạo một hàm sẽ làm giống như SELECTchức năng của cơ sở dữ liệu MySQL. Nó không cần phải đọc một dòng. Chỉ cần hiển thị tất cả nội dung của 3 tệp đó và sắp xếp chúng. có nghĩa là tôi cần một cái gì đó như thế này là đầu ra.

studentname | studentmail | studentnumber

Tôi đã đưa ra 2 cách.

Đầu tiên:

cat /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt > summary
cat summary

Điều này sẽ hiển thị tất cả nội dung của 3 tập tin với nhau, điều này rõ ràng là không tốt.

Tôi cũng đã đưa ra điều này:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt

Điều này không hiển thị tất cả các nội dung nhưng vẫn không thực sự được sắp xếp. Và tôi cũng sau này cần có thể chỉ chọn 1 hàng để được hiển thị.

Ai có thể giúp tôi làm điều này?

PS: Tôi biết sort, nhưng sau đó tất cả các nội dung được hiển thị dưới nhau, bằng cách nào đó tôi không làm điều đó phải không?

Câu trả lời:


2

Làm thế nào là các tập tin được sắp xếp bây giờ? Có phải dòng 3, nói, của cả ba tập tin đề cập đến cùng một học sinh? Nếu vậy, bạn có thể mở rộng pastegiải pháp của mình cho việc này:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt | sort

trong đó sẽ sắp xếp tất cả các hồ sơ (dòng) theo tên sinh viên. Bạn có thể sắp xếp theo một số lĩnh vực khác bằng cách sử dụng các tùy chọn phù hợp để sort.

Để chọn một hàng duy nhất được hiển thị, hãy làm theo bất kỳ lệnh nào mang lại danh sách được sắp xếp đúng với grep, ví dụ:

paste ... | sort | grep 'pattern'

trong đó 'mẫu' sẽ là tiêu chí tìm kiếm của bạn ở dạng biểu thức chính quy. Tất nhiên, nếu bạn chỉ chọn một dòng, thì không cần sort.

Một lệnh khác bạn có thể thấy hữu ích là join, nhưng tôi không biết đủ về nó để cho bạn một ví dụ về việc sử dụng nó.

Cập nhật: Định dạng với awk

Đầu ra của pastelệnh ở trên là một chuỗi các dòng, mỗi dòng bao gồm ba trường được phân tách với nhau bằng các tab, nghĩa là,

<field1> <tab> <field2> <tab> <field3>

Những dòng này có thể được định dạng bằng cách đặt chúng vào awklệnh sau .

awk -F '\t' '{printf "%-20s%-16s%s\n", $1, $2, $3}'

Đối -F '\t'số xác định rằng dấu tách trường đầu vào là một ký tự tab. Điều đó sẽ tách các dòng nhập vào ba lĩnh vực mà awkđề cập đến bởi $1, $2$3. Các awkngôn ngữ bao gồm một printfchức năng mà ứng xử cơ bản giống như các thư viện C printf()chức năng. Chuỗi định dạng ở trên chỉ định ba trường chuỗi. Đầu tiên, %-20sxác định rằng tham số chuỗi tương ứng được căn trái trong trường 20 ký tự. Thứ hai, %-16sxác định rằng tham số của nó được căn trái trong trường 16 ký tự. Cuối cùng, %schỉ cần nối thêm tham số của nó vào bất cứ thứ gì đã được định dạng cho đến nay. Cuối cùng, \nđặt một dòng mới ở cuối để mỗi dòng đầu vào được định dạng thành một dòng đầu ra riêng biệt.

Để điều chỉnh đầu ra theo sở thích của bạn, chỉ cần thay đổi độ rộng trường và / hoặc loại bỏ các dấu trừ để điều chỉnh đúng chuỗi. Để biết thêm tùy chọn, xem trang awkprintfngười đàn ông.


Khi tôi sử dụng tùy chọn dán, tôi nhận điều này là đầu ra: bryan 912391923 bryan@bryan hello 2030123 lalal@lallw ollo 23123123 ollo@ollo Điều tôi muốn là chúng sẽ được hiển thị trong một tùy chọn giống như bảng. Trong đó tên được hiển thị trong một cột đầu tiên và số trong một giây, v.v.
bryan

@bryan: Sẽ hữu ích khi biết nội dung và / hoặc định dạng của các tệp đó và kết quả mà bạn mong đợi. Nếu không, tôi chỉ đang đâm trong bóng tối. Đối với tôi, đầu ra tùy chọn dán ở trên trông khá tốt. Nó có tên, id và email của ba sinh viên. Là mỗi trong số những hồ sơ một dòng duy nhất? (Nhận xét SU dường như không hỗ trợ các dòng mới.)
garyjohn

Chà, nội dung của các tệp sau khá là simpel, * name.txt có trong tệp đó là ví dụ: bryan eeden xin chào, tệp number.txt có trong tệp của nó như ví dụ: 1234567 34567 34688 và mail.txt có ví dụ: bryan @bryan hello @ hello test @ test Tùy chọn dán thực sự đặt những thứ này cạnh nhau, nhưng tôi cần tăng các tab ở đầu ra vì đôi khi không có tab nào giữa 3 colums
bryan

@bryan: Nghe có vẻ pastecơ bản là hoạt động nhưng định dạng đầu ra không hoàn toàn đúng. ĐỒNG Ý. Một giải pháp cho vấn đề đó là đưa các kết quả vào expandlệnh với một cài đặt tab đủ lớn để tạo khoảng trống đầu ra như bạn muốn. Ví dụ: | expand -t20sẽ thay thế mỗi tab bằng đủ khoảng trắng để căn chỉnh từ tiếp theo ở cột tiếp theo là bội số của 20 khoảng trắng. Bạn cũng có thể định dạng đầu ra bằng cách sử dụng awk. Nó cho kết quả tốt nhưng là công việc nhiều hơn.
garyjohn

Wauw mát mẻ cảm ơn garyjohn. Việc mở rộng thực sự đã lừa Tôi đã nói để cố gắng sử dụng awk thực sự. Nhưng tôi không biết làm thế nào để sử dụng nó, tôi hoàn toàn không thể hiểu trang man của awk, có lẽ bạn có thể giúp tôi về cách sử dụng awk (nếu bạn biết cách hoạt động của nó).
bryan

1

nếu bạn muốn sắp xếp từng tệp rồi dán dữ liệu đã sắp xếp, với bash bạn có thể sử dụng quy trình thay thế:

paste -d '|' <(sort file1) <(sort file2) <(sort file3)
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.