Score:0

การรวมไฟล์ txt ที่คั่นด้วยแท็บตามคอลัมน์ (ซึ่งเป็นส่วนหัว) เป็น bash?

ธง us

ฉันมีไฟล์ข้อความสองไฟล์ซึ่งมีล้านเรคคอร์ด เรคคอร์ดทั้งหมดถูกคั่นด้วยแท็บ เราจะรวมสองไฟล์นี้ตามส่วนหัว (คอลัมน์) เดียวกันได้อย่างไร

ไฟล์:1

    LogEntryTime nameId PartnerId        
    2021-06-05T15:00:53 07 5lsddf qyutxwr 
        
        

ไฟล์:2

        ชื่อไอดี GroupId compnayId
        5lsddf l4buafm 0rd33cs               
    

ผลลัพธ์เช่นนี้:

    LogEntryTime nameId PartnerId GroupId compnayId
    2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

พยายามสิ่งนี้ แต่ไม่ทำงาน:

วาง file1.txt file2.txt | รหัสชื่อ -s $'\t' -t

และ

ไฟล์แมว1.txt file2.txt | awk -F '\t' '{พิมพ์ $ รายชื่อคอลัมน์ทั้งหมดที่นี่}'

awk ที่ใช้งานได้ แต่ต้องพูดถึงหมายเลขคอลัมน์ทั้งหมดที่นั่น

มีวิธีแก้ไขอื่นใดช่วยฉันด้วย

ขอบคุณล่วงหน้า

vanadium avatar
cn flag
ฉันอาจจะใช้ฐานข้อมูลสำหรับสิ่งนั้น
Vamshi Krishna CH avatar
us flag
ในเชลล์สคริปต์เราจะบรรลุสิ่งนั้นได้อย่างไร
vanadium avatar
cn flag
ฉันไม่คิดว่ามันจะง่าย วนหลายรอบแล้วจะช้า
Vamshi Krishna CH avatar
us flag
หลายร้อยระเบียนยังใช้ขั้นตอนเดียวกันหรือไม่
vanadium avatar
cn flag
หากลำดับของเร็กคอร์ดเหมือนกันในไฟล์ข้อความทั้งหมด (เช่น บันทึก 2 จากไฟล์ 1 เครื่อง บันทึก 2 จากไฟล์ 2 เป็นต้น) คำสั่ง awk ของคุณที่มีการวางจะตัดทิ้ง เพิ่มข้อมูลนั้นในคำถามของคุณดีกว่า ฉันสันนิษฐานว่าข้อมูลต้องตรงกัน ตัวอย่างเช่น `nameid 5lsddf` คือบันทึก 1 ในไฟล์ 1 แต่บันทึก *x* ในไฟล์ 2
Vamshi Krishna CH avatar
us flag
คอลัมน์เดียวกันจะตัดในไฟล์ที่สองที่ผสานกับไฟล์แรก นั่นคือทั้งหมด
Vamshi Krishna CH avatar
us flag
คุณช่วยเรื่องนี้ได้ไหม
Score:2
ธง cn

วนไฟล์หนึ่งในอาร์เรย์และแทนที่ฟิลด์แรกของไฟล์ที่สอง (ซึ่งก็คือ รหัสชื่อ) ด้วยดัชนีอาร์เรย์ที่สัมพันธ์กับฟิลด์ทั่วไป

awk -F \t+ -vOFS=\t 'NR==FNR{a[$2]=$0;next} {$1=a[$1]}1' ไฟล์{1,2}.txt
Score:2
ธง hr

หากไฟล์ของคุณสร้างไฟล์แยกแท็บ (TSV) อย่างถูกต้อง คุณก็สามารถใช้ได้ csvjoin จาก Python ตาม csvkit บรรจุุภัณฑ์.

อดีต. ที่ให้ไว้:

$ หัว file1.tsv file2.tsv | แมว -A
==> file1.tsv <==$
LogEntryTime^InameId^IPartnerId$
2021-06-05T15:00:53 07^I5lsddf^Iqyutxwr$
$
==> file2.tsv <==$
nameId^IGroupId^IcompnayId$
5lsddf^Il4buafm^I0rd33cs$

(แมว -A เพื่อทำให้มองเห็นแท็บได้ เช่น ^I) แล้ว

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

ในการรับเอาต์พุตกลับในรูปแบบ TSV ให้ใช้ รูปแบบ csv จากแพ็คเกจเดียวกัน:

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

โปรดทราบว่า -ฉัน ปิดใช้งานการอนุมานประเภท - ซึ่งบางครั้งอาจทำงานโดยไม่คาดคิด โดยเฉพาะกับฟิลด์วันที่และเวลา


ง่ายยิ่งขึ้นโดยใช้ มิลเลอร์ (มีให้จากที่เก็บจักรวาลเป็นแพ็คเกจ มิลเลอร์):

$ mlr --tsv เข้าร่วม -f file1.tsv -j nameId จากนั้นจัดลำดับใหม่ -f LogEntryTime file2.tsv
LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

เดอะ จัดลำดับใหม่ เป็นสิ่งจำเป็นเพราะโดยปริยาย mlr เข้าร่วม ส่งออกฟิลด์ทั่วไปก่อน (เช่นเดียวกับระบบ เข้าร่วม สั่งการ). โปรดทราบว่าสำหรับอินพุตที่ไม่เรียงลำดับ ทั้งหมดของ ไฟล์1.tsv จะถูกโหลดเข้าสู่หน่วยความจำ

Score:1
ธง cn

ด้วยชุดข้อมูลเฉพาะนี้:

อึดอัด '
    เริ่มต้น {FS = OFS = "\t"}
    NR == FNR {f1[$2] = $0; ต่อไป}
    {$1 = f1[$1]; พิมพ์}
' ไฟล์{1,2}.txt

มีการกล่าวถึงเฉพาะฟิลด์รวม ($2 ใน file1, $1 ใน file2)

สร้างเอาต์พุตที่คั่นด้วยแท็บ

LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

สำหรับผลลัพธ์ที่สวยงาม ให้ต่อท่อเข้าไป | คอลัมน์ -t -s $'\t' ที่จะได้รับ

LogEntryTime nameId PartnerId GroupId compnayId
2021-06-05T15:00:53 07 5lsddf qyutxwr l4buafm 0rd33cs

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา