Obcinanie łańcuchów po uruchomieniu skryptu awk
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
Czy mógłbyś spróbować śledzić, zgodnie z komentarzem OP, oba pliki mają tylko 1 linię. Tak więc użycie paste
polecenia, aby połączyć oba pliki, a następnie przetworzyć jego dane wyjściowe za pomocą awk
polecenia.
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=""
}'