rozszerzyć skrypt awk o wiele linii w obu plikach tekstowych, a nie, jeśli oba pliki mają tylko jeden rekord

Dec 01 2020

MOGĘ wygenerować to wyjście 3 .txt

AA;BB;CC;DD;

z 2 plików tekstowych. Oba pliki mają tylko jeden rekord

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

Używam tego skryptu awk.

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

Używam w ten sposób, używam pastepolecenia, aby połączyć oba pliki, a następnie przetwarzam jego wynik za pomocą awkpolecenia.

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

Ale czego ja chcę?
Muszę rozważyć więcej z jednego rekordu. Staram się dostosować ten skrypt do tej sytuacji. Widać, że teraz oba pliki mają nie tylko pojedyncze rekordy.

1 .txt

UU;    
AA;BB;
ZZ;KK;

2 .txt

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

wyjście 3 .txt, które próbuję wygenerować, to to

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

logika przetwarzania:

Powyższy kod używa tylko ciągów literałów w wyszukiwaniu skrótów indeksów tablic, więc nie obchodzi go, jakie znaki masz w danych wejściowych.
Jednak jeśli chodzi o przykładowe dane wyjściowe: jeśli w 2 .txt znajdują się wspólne pola, na przykład w 1 .txt BB;AA;, należy je połączyć w jednym wierszu, tj AA;BB;CC;DD.; Porządkowanie nie jest wymagane, na przykład nie ma znaczenia, jeśli dane wyjściowe to BB;AA;DD;CC;Tylko wymagany warunek, aby uniknąć powielania pól w tym samym wierszu

Kiedy mówię „unikaj duplikatów”, mam na myśli unikanie tego wyjścia

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

ponieważ wyjście powinno być

AA;BB;CC;DD;

Odpowiedzi

4 User Dec 01 2020 at 15:23

Może tego chcesz:

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
}

Użyj tego w ten sposób:

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

Oto kilka poprzednich pytań (prawdopodobnie twoich - możesz je przejrzeć i popracować nad tym, jak poprawnie zadać pytanie):

  • https://superuser.com/q/1600078
  • awk: zachowuje kolejność wierszy i usuwa zduplikowane łańcuchy (mirrory) podczas generowania danych
  • 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
  • Dynamiczne wyrażenia regularne w awk
  • Obcinanie łańcuchów po uruchomieniu skryptu awk