rozszerzyć skrypt awk o wiele linii w obu plikach tekstowych, a nie, jeśli oba pliki mają tylko jeden rekord
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 paste
polecenia, aby połączyć oba pliki, a następnie przetwarzam jego wynik za pomocą awk
polecenia.
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
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