Một tập lệnh shell để nối hai tập tin


8

Tôi muốn viết một shell scriptmà có được hai tập tin AB, và có được một kết quả như thế này:

Tập tin A:

user_a tel_a addr_a
user_b tel_b addr_b

Tập tin B:

process_1 user_a
process_2 user_a
process_3 user_b

Và kết quả:

user_a process_1 tel_a addr_a
user_a process_2 tel_a addr_a
user_b process_3 tel_b addr_b

Tôi có thể làm cái này như thế nào? awkhay cái gì khác?


2
Tôi nghĩ rằng nó có thể được thực hiện bằng cách sử dụng cutpastechỉ, nhưng tôi không có được synthax đúng.
Bernhard

Tệp của tôi có nhiều bản ghi và trường, tôi không thể cắt và dán !! Đây chỉ là một mẫu.
Navid Farhadi

1
@NavidFarhadi không cắt & dán: có hai lệnh thực tế cutpastexem trang hướng dẫn của họ.
Matteo

Tôi có thể tải cả hai tập tin trong bộ nhớ hoàn toàn và tôi cũng có thể sử dụng awk.
Navid Farhadi

Tôi cũng có thể sử dụng perl hoặc những thứ khác, nếu chúng được thực thi trong dòng lệnh linux.
Navid Farhadi

Câu trả lời:


15

join ...

join -1 2 -2 1 FileB FileA

Đầu ra

user_a process_1 tel_a addr_a
user_a process_2 tel_a addr_a
user_b process_3 tel_b addr_b

Các tệp đầu vào cần được sắp xếp theo trường khóa ... Các tệp ví dụ của bạn đã được sắp xếp, do đó không cần, nhưng nếu không, bạn có thể kết hợp sắp xếp như sau.

join -1 2 -2 1 <(sort -k2 FileB) <(sort FileA)

Có nghĩa là các tham số số?
Navid Farhadi

5
@Navid: Bạn luôn có thể có được mô tả chính xác và tốt nhất về các thông số của lệnh bằng cách tham khảo hướng dẫn , bằng cách nhập man joinvào dòng lệnh của thiết bị đầu cuối ... -1 2   -2 1 có nghĩa là: tham gia vào 'Trường thứ 2 tập tin thứ nhất'' Trường thứ 2 tập 1 '
Peter.O

3

joinpastekhông có sẵn ở mọi nơi (chẳng hạn như chúng không có trên hệ thống dựa trên BusyBox của tôi), đây là cách thực hiện với awk, như được yêu cầu:

awk 'BEGIN {
    while( (getline < "fileA") > 0) A[$1]=$2 OFS $3 # read fileA into the array A
    close("fileA")
  } {
    print $2, $1, A[$2]
  }' fileB

BTW bạn đã bỏ qua phần tách biệt A[$1]=$2 OFS $3... Đây là một biến thể khác tránh vòng lặp thủ công trong BEGIN, nhưng nó khá giống nhau (với awk ), mặc dù nó đưa ra một bài kiểm tra điều kiện không cần thiết cho tệp thứ hai: awk 'NR==FNR {A[$1]=$2 OFS $3;next} {print $2, $1, A[$2]}' fileA fileB... (+ 1)
Peter.O
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.