Linux에서 두 파일의 첫 번째 열을 일치시키고 File2의 마지막 열을 File1에 병합합니다.

Linux에서 두 파일의 첫 번째 열을 일치시키고 File2의 마지막 열을 File1에 병합합니다.

질문이 있습니다. 어리석은 질문일 수도 있지만 해결할 수는 없습니다. 파일의 열을 일치시키고 파일을 병합하는 것이 매우 간단하다는 것을 알고 있지만 불행히도 너무 많은 명령을 시도한 후에도 목표를 달성할 수 없습니다.

파일이 2개 있어요

파일 1:

BP2808  1.83684448966078    10.7449438228544    27.7057862093578    1.4123961881793E-07 4.26390957350344E-06
BP1319  2.75272032616902    8.74039675296892    27.5666097653874    1.51776372331745E-07    4.46142652354102E-06
dps 1.47015471230894    10.7061416142689    27.1494663323484    1.88317176247083E-07    5.39359707353824E-06
fusA    -1.38504972563843   11.8361844791496    27.0016273796008    2.03284239943838E-07    5.67671240043168E-06
BP1320  2.67552497792458    8.77604324182685    26.5184193030292    2.61037278592442E-07    7.11167415092092E-06

두 번째 파일에는 2개의 열이 있습니다.

파일 2:

BP2808  hypothetical protein
BP1319  Memebrane protein
dps     DNA-binding protein
fusA    elongation factor G 

원하는 출력:

BP2808  1.83684448966078    10.7449438228544    27.7057862093578    1.4123961881793E-07 4.26390957350344E-06    hypothetical protein
BP1319  2.75272032616902    8.74039675296892    27.5666097653874    1.51776372331745E-07    4.46142652354102E-06     Memebrane protein
dps 1.47015471230894    10.7061416142689    27.1494663323484    1.88317176247083E-07    5.39359707353824E-06     DNA-binding protein
fusA    -1.38504972563843   11.8361844791496    27.0016273796008    2.03284239943838E-07    5.67671240043168E-06    elongation factor G
BP1320  2.67552497792458    8.77604324182685    26.5184193030292    2.61037278592442E-07    7.11167415092092E-06    NA

나는 awk, 붙여넣기를 시도했습니다. 결합했지만 원하는 출력을 얻지 못했습니다. 제 기억이 맞다면 파일 3의 마지막 열에 있는 문자열 사이에 공백이 있기 때문인 것 같습니다.

paste File1 File2 | awk '{$2=""; print}' > Testing

awk -F\t '{getline f1 <"File1" ;print f1,$2}' OFS=, File2 > Testing

join -t'\t' <(sort File1) <(sort File2) > Testing

인터넷에서 많이 검색해 보면 더 많은 내용이 있습니다. 누구든지 나를 도울 수 있다면 시간이 많이 절약될 것입니다.

답변1

사용

join -t $'\t'

join백스페이스 이스케이프 특수 문자는 해석되지 않습니다. \t실제로는 유지됩니다(탭과 동일하지 않음). \tvs와 매우 유사합니다(아날로그가 없는 것처럼 동작함 echo '\t'echo -e '\t'joinecho-e). 따라서 쉘이 다음을 사용하여 문자를 해석하도록 해야 합니다.ANSI-C 인용문 $'...'.


awk ~ 할 것이다특수 문자를 해석하므로 다음을 사용할 수 있습니다.

awk -F'\t'

하지만

awk -F\t

\\t그러나 let the shellinterpret를 사용할 수는 있지만 \\제 생각에는 인용문이 더 읽기 쉽습니다.

후자의 명령의 경우 쉘은 (Try: ) \t로 해석됩니다 . 쉘이 해석하지 않도록 인용하십시오.techo \t

관련 정보