จับคู่ตามคอลัมน์และพิมพ์เป็นบรรทัด

พยายามค้นหาแต่ไม่พบสิ่งใดที่สำคัญ

ฉันมี 2 ไฟล์:
1:

asdfdata:tomatch1:asdffdataaa
asdfdata2:tomatch2:asdffdata33
asdf:tomatch3:asdfx

2:

bek:tomatch1:beke  
lek:tomatch3:lekee  
wen:tomatch2:wenne    

ฉันต้องการจับคู่ด้วย clolumn ที่สองในทั้งสองอย่างด้วยข้อมูลใดก็ตามที่อยู่ในบรรทัด จากนั้นนำสิ่งนี้และพิมพ์ไปที่บรรทัดดังนี้:

asdfdata:tomatch1:asdffdataaa:bek:beke
asdfdata2:tomatch2:asdffdata33:wen:wenne    

ฯลฯ

ฉันคิดว่า awk น่าจะดีที่สุด จับคู่สองไฟล์ตามคอลัมน์ ทีละบรรทัด - ไม่มีคีย์ ดูเหมือนว่าจะคล้ายกัน!
ขอบคุณสำหรับความช่วยเหลือใดๆ!!


person jimm08998    schedule 29.03.2015    source แหล่งที่มา


คำตอบ (3)


ใช้คำสั่งเข้าร่วมเช่น:

join -t":" -1 2 -2 2 <(sort -t":" -k 2 file1.txt) <(sort -t":" -k 2 file2.txt)

ต่อไปนี้เป็นวิธีการทำงาน:

-t ใช้สำหรับ delimeter
-1 - จากไฟล์แรก ฟิลด์ที่สองคั่นด้วย ///
-2 - จากไฟล์ที่สอง ฟิลด์ที่สองคั่นด้วย uma
เข้าร่วม ต้องการไฟล์อินพุตที่จะเรียงลำดับในฟิลด์ที่ เราต้องการเข้าร่วมด้วยเหตุนี้คุณเห็นคำสั่ง sort พร้อมฟิลด์ที่สองที่ระบุด้วยตัวเลือก -k และตัวเลือก t อีกครั้งโดยใช้ delimeter เป็นโคลอน (:) และส่งอินพุตเพื่อเข้าร่วมคำสั่งหลังจากเรียงลำดับอินพุตตามฟิลด์ที่สอง

person SMA    schedule 29.03.2015
comment
ขอบคุณสำหรับความช่วยเหลือเพื่อน :) - person jimm08998; 29.03.2015

ฉันคิดว่านี่ง่ายที่สุดกับ join และ sort สมมติว่า bash (สำหรับการทดแทนกระบวนการ):

join -t :  -j 2 <(sort -t :  -k 2 file1) <(sort -t : -k 2 file2)

อีกทางหนึ่งด้วย awk (หากไม่สามารถพึ่งพา bash ได้และไม่ต้องการไฟล์ชั่วคราว):

awk -F : 'NR == FNR { a[$2] = $0; next } { line = a[$2] FS $1; for(i = 3; i <= NF; ++i) line = line FS $i; print line }' file1 file2

นั่นคือ

NR == FNR {                   # while processing the first file
  a[$2] = $0                  # remember lines by key
  next
}
{                             # while processing the second file
  line = a[$2] FS $1          # append first field to remembered line
                              # from the first file with the current key
  for(i = 3; i <= NF; ++i) {  # append all other fields (except the second)
    line = line FS $i
  }
  print line                  # print result
}
person Wintermute    schedule 29.03.2015
comment
ขอบคุณสำหรับความช่วยเหลือ โซลูชันทั้งของคุณและโปสเตอร์ข้างต้นใช้งานได้ดี เยี่ยมมาก! - person jimm08998; 29.03.2015

สิ่งนี้อาจใช้ได้ผลสำหรับคุณ (GNU sed):

sed -r 's|(.*)(:.*:)(.*)|/\2/s/$/:\1:\3/|' file2 | sed -f - file1

สิ่งนี้จะสร้างสคริปต์ sed จาก file2 เพื่อทำงานกับ file1

person potong    schedule 29.03.2015