file1의 열 값이 file2에 존재하는 경우 file1의 모든 행 값을 file2에 추가합니다.

file1의 열 값이 file2에 존재하는 경우 file1의 모든 행 값을 file2에 추가합니다.

파일이 두 개 있어요

파일 A

Aacs    4498.5  778.5   995.5   1263    530
Abracl  2824    19.31   58.45   55.67   33.075
Ackr3   1294.5  19.5    47.5    38.5    4.5
Actb    246564  4472.46 11134.1 12272.6 2228.05

문서 B

chr5    124350754       124353027       Aacs    1639_47_175_59_95
chr5    125140780       125141989       Aacs    920_132_115_65_389
chr5    125148638       125149481       Aacs    357_56_65_48_116
chr1    89576587        89577508        Ackr3   618_804_385_412_1239
chr1    89579859        89582071        Ackr3   1340_429_274_242_611
chr5    142819302       142820142       Actb    614_116_105_58_371
chr5    142821400       142822219       Actb    544_74_97_45_118

FileA의 열 1에 있는 값이 FileB에 존재하는 경우 일치하는 값이 FileB에 여러 번 나타나더라도 FileA의 모든 행 값을 FileB에 추가해야 합니다.

그래서 그 이후로도끼FileA가 FileB에 존재하는 경우 모든 해당 값을 다음과 같이 FileB에 여러 번 추가하고 싶습니다.

chr5    124350754       124353027       Aacs    1639_47_175_59_95    4498.5  778.5   995.5   1263    530
chr5    125140780       125141989       Aacs    920_132_115_65_389    4498.5  778.5   995.5   1263    530
chr5    125148638       125149481       Aacs    357_56_65_48_116    4498.5  778.5   995.5   1263    530

Python에서 pandas를 사용하여 이 작업을 수행할 수 있지만 awk 또는 다른 unix 툴킷을 사용하여 이 작업을 수행하는 방법을 찾고 싶습니다.

답변1

$ awk 'NR==FNR{key=$1; sub(/[^[:space:]]+/,""); a[key]=$0; next} {print $0 a[$4]}' FileA FileB
chr5    124350754       124353027       Aacs    1639_47_175_59_95    4498.5  778.5   995.5   1263    530
chr5    125140780       125141989       Aacs    920_132_115_65_389    4498.5  778.5   995.5   1263    530
chr5    125148638       125149481       Aacs    357_56_65_48_116    4498.5  778.5   995.5   1263    530
chr1    89576587        89577508        Ackr3   618_804_385_412_1239   1294.5  19.5    47.5    38.5    4.5
chr1    89579859        89582071        Ackr3   1340_429_274_242_611   1294.5  19.5    47.5    38.5    4.5
chr5    142819302       142820142       Actb    614_116_105_58_371    246564  4472.46 11134.1 12272.6 2228.05
chr5    142821400       142822219       Actb    544_74_97_45_118    246564  4472.46 11134.1 12272.6 2228.05

출력의 필드를 정렬하려는 경우 다양한 옵션이 있으며 가장 간단한 방법은 다음으로 파이프하는 것입니다 column.

$ awk 'NR==FNR{key=$1; sub(/[^[:space:]]+/,""); a[key]=$0; next} {print $0 a[$4]}' FileA FileB | column -t
chr5  124350754  124353027  Aacs   1639_47_175_59_95     4498.5  778.5    995.5    1263     530
chr5  125140780  125141989  Aacs   920_132_115_65_389    4498.5  778.5    995.5    1263     530
chr5  125148638  125149481  Aacs   357_56_65_48_116      4498.5  778.5    995.5    1263     530
chr1  89576587   89577508   Ackr3  618_804_385_412_1239  1294.5  19.5     47.5     38.5     4.5
chr1  89579859   89582071   Ackr3  1340_429_274_242_611  1294.5  19.5     47.5     38.5     4.5
chr5  142819302  142820142  Actb   614_116_105_58_371    246564  4472.46  11134.1  12272.6  2228.05
chr5  142821400  142822219  Actb   544_74_97_45_118      246564  4472.46  11134.1  12272.6  2228.05

답변2

다음을 사용하여 두 파일을 간단히 연결할 수 있습니다.가입(1)

join -1 1 -2 4 -o 2.1,2.2,2.3,2.4,2.5,1.2,1.3,1.4,1.5,1.6 FileA FileB

어떤 열을 지정하십시오.-1그리고-2파일 1(FileA)과 2(FileB)를 결합하려고 합니다. 이것-영형예제 출력에 맞게. 출력을 예쁜 열로 표시하려면 출력을 다음으로 파이프하십시오.column -t

관련 정보