Próbuję scalić 2 pliki z nierówną liczbą wierszy i na podstawie kolumny 2 w każdym pliku.

Plik 1

  3 09
 10 11
 28 12
 23 14

Plik 2

 10 10
 11 11
 29 12
 25 13
 25 14

Po scaleniu plik powinien być:

 09 3 0
 10 0 10
 11 10 11
 12 28 29
 13 0 25
 14 23 25

W innym wymaganiu, jeśli plik 1 lub plik 2 nie ma odpowiedniego wpisu, muszę tam wstawić 0. Zmodyfikowany plik 1, plik 2 i scalony plik są udostępniane powyżej.

Proszę pomóż.

1
Nishant Kansal 3 kwiecień 2020, 19:46

4 odpowiedzi

Najlepsza odpowiedź

Co powiesz na skorzystanie z dołączenia?

join -12 -22 -a1 -e 0 -o'0,1.1,2.1' f1 f2

Mam nadzieję, że tego chcesz. Pola, które nie są zgodne, otrzymają 0.

$ cat f1
3 09
9 10
10 11
28 12
27 13
23 14

$ cat f2
10 10
11 11
29 12
25 13
25 14

$ join -12 -22 -a1 -e 0 -o'0,1.1,2.1' f1 f2
09 3 0
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25

Polecenie join łączy linie dwóch plików, które mają wspólne pole danych. W tym przypadku: Połącz plik2 i plik1 używając pola 1 (-1 2) pliku f2 i pola 2 (-2 2) pliku f1.

Wynik będzie następujący: joined field, field 1 of file1, field 1 of file2 - -o'0,1.1,2.1', jeśli brakuje pola, wpisz 0 -e0

Jeśli jeden z dwóch plików ma więcej rekordów, dodaj je (w tym przypadku plik1) -a1

1
vijay 3 kwiecień 2020, 17:27

Spróbuj tego pls:

awk 'NR==FNR{a[$2]=$1;next}{print $2,$1,a[$2]}' file2 file1
1
Tiw 3 kwiecień 2020, 16:50

Możesz użyć tego gnu-awk polecenia, które zadziała niezależnie od tego, który z 2 plików ma więcej rekordów:

awk 'FNR == NR {
   map[$2] = $1
   next
}
{
   map[$2] = ($2 in map ? map[$2] OFS : "") $1
}
END {
   PROCINFO["sorted_in"] = "@ind_str_asc"
   for (i in map)
      print i, map[i]
}' file1 file2
09 3
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25
3
anubhava 3 kwiecień 2020, 17:46
$ join -j 2 -a 1 -a 2 file1 file2
09 3
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25

Lub jeśli rzeczywiste pliki wejściowe nie są już posortowane w drugiej kolumnie, jak w przykładzie:

$ join -j 2 -a 1 -a 2 <(sort -k2,2 file1) <(sort -k2,2 file2)
09 3
10 9 10
11 10 11
12 28 29
13 27 25
14 23 25
2
Ed Morton 3 kwiecień 2020, 17:25