Điểm:0

hợp nhất các tệp txt được phân tách bằng tab dựa trên cột (là tiêu đề) trong bash?

lá cờ us

Tôi có hai tệp văn bản chứa hàng triệu bản ghi, tất cả các bản ghi đều được phân cách bằng tab, làm cách nào để hợp nhất hai tệp này dựa trên cùng một tiêu đề (cột)?

tệp: 1

    LogEntryTên thời gianId PartnerId        
    2021-06-05T15:00:53 07 5lsddf qyutxwr 
        
        

tệp: 2

        nameId GroupId công tyId
        5lsddf l4buafm 0rd33cs               
    

đầu ra như thế này:

    LogEntryTên thời gianId PartnerId GroupId công tyId
    2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Đã thử điều này nhưng không hoạt động:

dán tệp1.txt tệp2.txt | nameId -s $'\t' -t

mèo file1.txt file2.txt | awk -F '\t' '{in $ liệt kê tên tất cả các cột ở đây}'

awk cái đang hoạt động nhưng cần đề cập đến tất cả các số cột ở đó.

có giải pháp nào khác giúp tôi không.

cảm ơn trước

vanadium avatar
lá cờ cn
Tôi có thể sẽ sử dụng một cơ sở dữ liệu cho điều đó.
Vamshi Krishna CH avatar
lá cờ us
trong shell script làm thế nào chúng ta có thể đạt được điều đó?
vanadium avatar
lá cờ cn
Tôi không nghĩ rằng điều này sẽ được dễ dàng. Nhiều vòng lặp, và nó sẽ chậm.
Vamshi Krishna CH avatar
lá cờ us
cho hàng trăm hồ sơ cũng sử dụng cùng một thủ tục?
vanadium avatar
lá cờ cn
Nếu thứ tự của các bản ghi giống hệt nhau trong tất cả các tệp văn bản (tức là bản ghi 2 của tệp1 maches bản ghi 2 của tệp2, v.v.), thì lệnh awk của bạn với dán sẽ cắt nó. Tốt hơn nên thêm thông tin đó vào câu hỏi của bạn. Tôi đã giả định rằng dữ liệu cần phải khớp, ví dụ: `nameid 5lsddf` là bản ghi 1 trong tệp 1, nhưng ghi *x* trong tệp 2.
Vamshi Krishna CH avatar
lá cờ us
cùng một cột sẽ cắt trong tệp thứ hai hợp nhất với tệp đầu tiên. đó là tất cả
Vamshi Krishna CH avatar
lá cờ us
bạn có thể giúp về điều này?
Điểm:2
lá cờ hr

Nếu các tệp của bạn là các tệp được phân tách bằng tab (TSV) được tạo đúng cách, thì bạn có thể sử dụng csvjoin từ dựa trên Python csvkit bưu kiện.

Bán tại. được cho:

$head file1.tsv file2.tsv | con mèo -A
==> file1.tsv <==$
LogEntryTime^InameId^IPartnerId$
2021-06-05T15:00:53 07^I5lsddf^Iqyutxwr$
$
==> file2.tsv <==$
nameId^IGroupId^IcompnayId$
5lsddf^Il4buafm^I0rd33cs$

(con mèo -A để hiển thị các tab, như ^ tôi) sau đó

$ csvjoin -I -t -c nameId file1.tsv file2.tsv
LogEntryTime,nameId,PartnerId,GroupId,compnayId
2021-06-05T15:00:53 07,5lsddf,qyutxwr,l4buafm,0rd33cs

Để lấy lại đầu ra ở định dạng TSV, hãy sử dụng định dạng csv từ cùng một gói:

$ csvjoin -I -t -c nameId file1.tsv file2.tsv | csvformat -T
LogEntryTên thời gianId PartnerId GroupId công tyId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Lưu ý rằng -TÔI vô hiệu hóa suy luận kiểu - đôi khi có thể hoạt động không mong muốn, đặc biệt là với các trường ngày giờ.


Thậm chí đơn giản hơn, sử dụng cối xay (có sẵn từ kho vũ trụ, dưới dạng gói cối xay):

$ mlr --tsv tham gia -f file1.tsv -j nameId sau đó sắp xếp lại -f LogEntryTime file2.tsv
LogEntryTên thời gianId PartnerId GroupId công tyId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Các sắp xếp lại là cần thiết bởi vì theo mặc định mlr tham gia xuất trường chung trước (giống như hệ thống tham gia chỉ huy). Lưu ý rằng đối với đầu vào chưa được sắp xếp, toàn bộ tập tin1.tsv sẽ được nạp vào bộ nhớ.

Điểm:2
lá cờ cn

Lặp lại một trong các tệp thành một mảng và thay thế trường đầu tiên của tệp thứ hai (là tênId) với chỉ số mảng tương quan với trường chung.

awk -F \t+ -vOFS=\t 'NR==FNR{a[$2]=$0;tiếp theo} {$1=a[$1]}1' tệp{1,2}.txt
Điểm:1
lá cờ cn

Với bộ dữ liệu cụ thể này:

awk'
    BẮT ĐẦU {FS = OFS = "\t"}
    NR == FNR {f1[$2] = $0; tiếp theo}
    {$1 = f1[$1]; in}
' tập tin{1,2}.txt

Chỉ có trường tham gia ($2 trong tệp1, $1 trong tệp2) được đề cập.

Tạo đầu ra được phân tách bằng tab

LogEntryTên thời gianId PartnerId GroupId công tyId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Để có đầu ra đẹp, hãy chuyển sang | cột -t -s $'\t' để có được

LogEntryTên thời gianId PartnerId GroupId công tyId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.