perpanjang skrip awk untuk beberapa baris di kedua file teks dan tidak jika kedua file hanya memiliki satu catatan

Dec 01 2020

Saya BISA menghasilkan output 3 .txt ini

AA;BB;CC;DD;

dari 2 file teks. Kedua file tersebut hanya memiliki satu record

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

Saya menggunakan skrip awk ini.

BEGIN{
  FS=OFS=";"
}
{
  for(i=1;i<=NF;i++){
    if(!seen[$i]++){ val=(val?val OFS:"")$i }
  }
  print val
  delete seen
  val=""
}

Saya menggunakan cara ini, saya menggunakan pasteperintah untuk menggabungkan kedua file dan kemudian memproses outputnya dengan awkperintah.

paste 1st.txt 2nd.txt | awk -f tst.awk > "3.txt"

Tapi apa yang kuinginkan?
Saya perlu mempertimbangkan lebih dari satu rekaman tunggal. Saya mencoba menyesuaikan skrip ini untuk situasi ini. Anda dapat melihat bahwa sekarang kedua file tidak hanya memiliki satu record.

1 .txt

UU;    
AA;BB;
ZZ;KK;

2 .txt

CC;DD;BB;AA;
LL;KK;
GH;ZZ;SS;

output 3 .txt yang saya coba hasilkan adalah ini

UU;
AA;BB;CC;DD;
ZZ;KK;LL;GH;SS;

memproses logika:

Kode di atas hanya menggunakan string literal dalam pencarian hash indeks array sehingga tidak peduli karakter apa yang Anda miliki dalam input Anda.
Namun tentang contoh keluaran: jika dalam 2 .txt juga terdapat field umum dalam 1 .txt. Misalnya, BB;AA;maka Anda perlu menggabungkannya dalam satu baris, yaitu AA;BB;CC;DD; Pengurutan tidak diperlukan, misalnya tidak relevan jika output BB;AA;DD;CC;hanya kondisi yang diperlukan hindari duplikat bidang pada baris yang sama

Ketika saya mengatakan 'hindari duplikat' maksud saya hindari keluaran ini

AA;BB;CC;DD;BB;AA;

karena keluaran seharusnya

AA;BB;CC;DD;

Jawaban

4 User Dec 01 2020 at 15:23

Mungkin ini yang Anda inginkan:

BEGIN{FS=OFS=";"}
{sub(/;$/,"")} NR==FNR{ for (i=1;i<=NF;++i) for (j=1;j<=NF;++j) if (j!=i&&!b[$i,$j]++) a[$i,++c[$i]]=$j
    next
}
{
    delete b
    for (i=1;i<=NF;++i)
        ++b[$i] for (i=1;i<=NF;++i) for (j=1;j<=c[$i];++j)
            if (!b[a[$i,j]]++) $(NF+1)=a[$i,j]
    print
}

Gunakan seperti ini:

awk -f script.awk 2.txt 1.txt

Berikut adalah beberapa pertanyaan sebelumnya (mungkin milik Anda - Anda mungkin ingin melihatnya dan bekerja tentang cara mengajukan pertanyaan Anda dengan benar):

  • https://superuser.com/q/1600078
  • awk: pertahankan urutan baris dan hapus string duplikat (mirror) saat membuat data
  • https://superuser.com/q/1600557
  • https://superuser.com/q/1601402
  • https://superuser.com/q/1602713
  • https://stackoverflow.com/q/64929865
  • https://superuser.com/q/1604046
  • Ekspresi reguler dinamis di awk
  • Pemotongan string setelah menjalankan skrip awk