Script shell untuk menggabungkan dua file


8

Saya ingin menulis shell scriptyang mendapatkan dua file Adan B, dan mendapatkan hasil seperti ini:

File A:

user_a tel_a addr_a
user_b tel_b addr_b

File B:

process_1 user_a
process_2 user_a
process_3 user_b

Dan hasilnya:

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

Bagaimana saya bisa melakukan ini? awkatau sesuatu yang lain?


2
Saya pikir itu bisa dilakukan menggunakan cutdan pastehanya, tapi saya tidak mendapatkan synthax yang benar.
Bernhard

File saya memiliki banyak catatan dan bidang, saya tidak dapat memotong dan menempel !! Ini hanya contoh.
Navid Farhadi

1
@NavidFarhadi tidak memotong & menempel: ada dua perintah aktual cutdan pastelihat halaman manual mereka.
Matteo

Saya dapat memuat kedua file dalam memori sepenuhnya dan saya juga dapat menggunakan awk.
Navid Farhadi

Saya juga dapat menggunakan perl atau orang lain, jika mereka dieksekusi di baris perintah linux.
Navid Farhadi

Jawaban:


15

join ...

join -1 2 -2 1 FileB FileA

Keluaran

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

File input perlu diurutkan berdasarkan bidang kunci ... File contoh Anda sudah diurutkan, jadi tidak perlu, tetapi jika tidak, Anda bisa memasukkan sortir sebagai berikut.

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

Apa artinya parameter angka?
Navid Farhadi

5
@Navid: Anda selalu bisa mendapatkan deskripsi paramater perintah yang terbaik dan paling akurat dengan merujuk pada manual , dengan mengetik man joinke baris perintah terminal ... -1 2   -2 1 berarti: bergabung di 'file ke-2 file-ke-2' dan ' 2-file 1st-field '
Peter.O

3

Karena joindan pastetidak tersedia di mana-mana (mereka tidak ada di sistem berbasis BusyBox saya, misalnya), berikut adalah cara melakukannya dengan awk, seperti yang diminta:

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 Anda melewatkan pemisah A[$1]=$2 OFS $3... Ini adalah varian lain yang menghindari loop manual di BEGIN, tapi itu hampir sama (untuk awk ), meskipun tidak memperkenalkan tes kondisi yang tidak perlu untuk file kedua: awk 'NR==FNR {A[$1]=$2 OFS $3;next} {print $2, $1, A[$2]}' fileA fileB... (+ 1)
Peter.O
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.