Obcinanie łańcuchów po uruchomieniu skryptu awk

Nov 23 2020

Mam ten kod

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] }

Używam kodu w ten sposób

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

Mam dwa pliki tekstowe

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

Próbuję wygenerować to wyjście 3 .txt

AA;BB;CC;DD;

ale z tym skryptem nie jest to możliwe, ponieważ ten skrypt tylko zwraca AA;BB;

logika: powyższe używa po prostu ciągów literałów w wyszukiwaniu hash indeksów tablic, więc nie ma znaczenia, 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 wyjście to BB;AA;DD;CC;
Tylko warunek, który jest wymagane jest unikanie duplikatów, ale mój skrypt już to robi

Odpowiedzi

1 RavinderSingh13 Nov 23 2020 at 08:33

Czy mógłbyś spróbować śledzić, zgodnie z komentarzem OP, oba pliki mają tylko 1 linię. Tak więc użycie pastepolecenia, aby połączyć oba pliki, a następnie przetworzyć jego dane wyjściowe za pomocą awkpolecenia.

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=""
}'