การตัดสตริงหลังจากรันสคริปต์ awk

Nov 23 2020

ฉันมีรหัสนี้

BEGIN { FS=OFS=";" }
{ key = $(NF-1) } NR == FNR { for (i=1; i<(NF-1); i++) { if ( !seen[key,$i]++ ) {
            map[key] = (key in map ? map[key] OFS : "") $i } } next } { print $0 map[key] }

ฉันใช้รหัสในลักษณะนี้

awk -f tst.awk 2.txt 1.txt

ฉันมีไฟล์ข้อความสองไฟล์

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

ฉันพยายามสร้างเอาต์พุต3 .txt นี้

AA;BB;CC;DD;

แต่ด้วยสคริปต์นี้เป็นไปไม่ได้เนื่องจากสคริปต์นี้ส่งคืนเท่านั้น AA;BB;

ตรรกะ:ข้างต้นใช้สตริงตามตัวอักษรในการค้นหาแฮชของดัชนีอาร์เรย์ดังนั้นจึงไม่สนใจว่าคุณจะมีอักขระใดในข้อมูลที่คุณป้อน อย่างไรก็ตามเกี่ยวกับเอาต์พุตตัวอย่าง:
ถ้าใน2 .txt มีฟิลด์ทั่วไปเช่นกันใน1 .txt ตัวอย่างเช่นBB;AA;คุณต้องเชื่อมต่อเข้าด้วยกันในแถวเดียวกล่าวAA;BB;CC;DD;คือไม่จำเป็นต้องมีการสั่งซื้อตัวอย่างเช่นไม่เกี่ยวข้องหากเอาต์พุตเป็นBB;AA;DD;CC;
เงื่อนไขเท่านั้นที่เป็น จำเป็นคือหลีกเลี่ยงรายการที่ซ้ำกัน แต่สคริปต์ของฉันทำสิ่งนี้แล้ว

คำตอบ

1 RavinderSingh13 Nov 23 2020 at 08:33

คุณช่วยกรุณาลองทำตามความคิดเห็นของ OP ทั้งสองไฟล์มีเพียง 1 บรรทัด ดังนั้นใช้pasteคำสั่งเพื่อรวมไฟล์ทั้งสองไฟล์แล้วประมวลผลเอาต์พุตด้วยawkคำสั่ง

paste -d';' 1.txt 2.txt | 
awk '
BEGIN{
  FS=OFS=";"
}
{
  for(i=1;i<=NF;i++){
    if(!seen[$i]++){ val=(val?val OFS:"")$i }
  }
  print val
  delete seen
  val=""
}'