расширить сценарий awk для нескольких строк в обоих текстовых файлах, а не если оба файла имеют только одну запись

Dec 01 2020

Я МОГУ сгенерировать этот вывод 3 .txt

AA;BB;CC;DD;

из 2-х текстовых файлов. Оба файла содержат только одну запись

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

Я использую этот скрипт awk.

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

Я использую таким образом, я использую pasteкоманду для объединения обоих файлов, а затем обрабатываю его вывод по awkкоманде.

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

Но чего я хочу?
Мне нужно рассмотреть больше одной записи. Я пытаюсь адаптировать этот сценарий к этой ситуации. Как видите, теперь в обоих файлах есть не только отдельные записи.

1 .txt

UU;    
AA;BB;
ZZ;KK;

2 .txt

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

вывод 3 .txt, который я пытаюсь сгенерировать, это

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

логика обработки:

В приведенном выше коде просто используются буквальные строки при поиске по хешу индексов массива, поэтому ему все равно, какие символы вы вводите.
Однако о выходе образца: если в 2 .txt есть общие поля также в 1 .txt.for примере , BB;AA;то вам нужно объединить их в один ряд, то есть AA;BB;CC;DD; Упорядочивание не требуется, например, не актуально, если вывод - BB;AA;DD;CC;Только обязательное условие - избегать дублирования полей в одной строке

Когда я говорю «избегать дубликатов», я имею в виду «избегать этого вывода»

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

потому что вывод должен быть

AA;BB;CC;DD;

Ответы

4 User Dec 01 2020 at 15:23

Может быть, это то, что вы хотите:

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
}

Используйте это так:

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

Вот несколько предыдущих вопросов (предположительно, ваши - возможно, вы захотите просмотреть их и поработать, как правильно задать свой вопрос):

  • https://superuser.com/q/1600078
  • awk: сохранить порядок строк и удалить повторяющиеся строки (зеркала) при генерации данных
  • 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
  • Динамические регулярные выражения в awk
  • Усечение строк после запуска сценария awk