Mam plik Like 1:
0 AFFX-SNP-000541 NA
0 AFFX-SNP-002255 NA
1 rs12103 0.6401
1 rs12103_1247494 0.696
1 rs12142199 0.7672
I plik2:
0 AFFX-SNP-000541 1
0 AFFX-SNP-002255 1
1 rs12103 0.5596
1 rs12103_1247494 0.5581
1 rs12142199 0.4931
I chciałby plik3 taki, że:
0 AFFX-SNP-000541 NA 1
0 AFFX-SNP-002255 NA 1
1 rs12103 0.6401 0.5596
1 rs12103_1247494 0.696 0.5581
1 rs12142199 0.7672 0.4931
Co oznacza wstawienie czwartej kolumny pliku2 do pliku1 pod nazwą drugiej kolumny.
text-processing
awk
join
bioinformatics
Dadong Zhang
źródło
źródło
Odpowiedzi:
To powinno to zrobić:
Ważne : zakłada się, że twoje pliki są posortowane (jak w twoim przykładzie) według nazwy SNP. Jeśli nie, posortuj je najpierw:
Wydajność:
Objaśnienie (z
info join
):Tak więc powyższe polecenie łączy pliki w drugim polu i drukuje 1., 2. i 3. pole pliku 1, a następnie 3. pole pliku2.
źródło
Możesz użyć
awk
:wydajność:
Wyjaśnienie:
Przejście
file2
(NR==FNR
dotyczy tylko pierwszego argumentu pliku). Zapisz w kolumnie 3 tablicy używając hash-2 jako kolumny klucza:h[$2] = $3
. Następnie przejdźfile1
i wyślij wszystkie trzy kolumny$1,$2,$3
, dołączając odpowiednią zapisaną kolumnę z tablicy mieszającejh[$2]
.źródło
h[$2] = $3
to zadanie mieszania. Zapisuje$3
jako wartość i$2
jako klucz. Przykład:h["name"] = "Dadong"
. Terazprint h["name"]
wyjściaDadong
. Robi to, co chcesz, dokładnie pasuje do drugiej kolumny z obu plików.Jeśli nie potrzebujesz żadnego zamówienia, byłoby proste rozwiązanie
Zakłada się, że wszystkie wiersze mają trzy wpisy, a kolumny 1 i 2 obu plików są takie same (jak w przykładowych danych)
źródło
paste
paste
czy możesz znaleźć sposób, aby odpowiedzieć na to z Coreutils?