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.