Cocokkan berdasarkan kolom dan cetak ke baris

Mencoba mencari tetapi tidak menemukan sesuatu yang penting

Saya punya 2 file:
1:

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

2:

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

Saya ingin mencocokkan kolom kedua di keduanya, dengan data apa pun yang ada di baris, lalu ambil ini dan cetak ke baris seperti ini:

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

dll.

Saya membayangkan awk akan menjadi yang terbaik, Cocokkan dua file berdasarkan kolom baris demi baris - tanpa kunci sepertinya mirip dengan ini!
Terima kasih atas bantuannya!!


person jimm08998    schedule 29.03.2015    source sumber


Jawaban (3)


Gunakan perintah gabung seperti:

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

Begini cara kerjanya:

-t untuk pembatas
-1 - dari file pertama kolom kedua dibatasi oleh ":"
-2 - dari file kedua kolom kedua dibatasi oleh ":"
join membutuhkan file masukan untuk diurutkan berdasarkan bidang yang mana kami ingin bergabung maka Anda melihat perintah pengurutan dengan bidang kedua ditentukan dengan opsi -k dan opsi t lagi menggunakan pembatas sebagai titik dua (:) dan meneruskan input ke perintah gabung setelah mengurutkan input berdasarkan bidang kedua.

person SMA    schedule 29.03.2015
comment
Terima kasih atas bantuannya kawan :) - person jimm08998; 29.03.2015

Saya pikir ini paling sederhana dengan join dan sort. Dengan asumsi bash (untuk proses substitusi):

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

Alternatifnya, dengan awk (jika bash tidak dapat diandalkan dan file sementara tidak diinginkan):

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

Itu adalah

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
Terima kasih atas bantuannya, baik solusi Anda maupun poster di atas semuanya berfungsi, sangat bermanfaat! - person jimm08998; 29.03.2015

Ini mungkin berhasil untuk Anda (GNU sed):

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

Ini membuat skrip sed dari file2 untuk dijalankan melawan file1.

person potong    schedule 29.03.2015