각 행의 패턴을 기반으로 두 파일 사이의 한 열에서 다른 열로 값을 인쇄합니다.

각 행의 패턴을 기반으로 두 파일 사이의 한 열에서 다른 열로 값을 인쇄합니다.

파일 1에는 두 개의 열이 포함되어 있습니다. 1열에는 대사 경로의 이름이 포함되고, 2열에는 경로에 존재하는 유전자의 수가 포함됩니다.

pathway1 3   
pathway2 4  
pathway3 5  
pathway4 6  
pathway5 9

파일 2에는 3개의 열이 있습니다. 1열에는 그룹 번호가 포함되고, 2열에는 특정 그룹에 속하는 대사 경로의 이름이 포함되며, 3열에는 각 경로에 존재하는 유전자의 수가 포함됩니다.

group1  pathway1  2   
group1  pathway4  5  
group1  pathway2  3  

group2  pathway2 1  
group2  pathway3 2 

파일 1과 파일 2는 csv 형식입니다.

원하는 출력:
다음과 같이 경로 이름을 기준으로 File2의 열 3 옆에 있는 File1의 열 2에 있는 유전자 수를 어떻게 인쇄할 수 있습니까?

group1  pathway1 2 3   
group1  pathway4 5 6  
group1  pathway2 3 4  

group2  pathway2 1 4  
group2  pathway3 2 5 

답변1

join이것이 하는 일 입니다 :

$ join -o 1.1,1.2,1.3,2.2 -12 -21 <(sort -k2 file2) <(sort file1) 
group1 pathway1 2 3
group2 pathway2 1 4
group1 pathway2 3 4
group2 pathway3 2 5
group1 pathway4 5 6

또는 입력 파일이 실제로 제안한 대로 쉼표로 구분되어 있지만 질문에 표시되지 않는 경우:

$ join -t, -o 1.1,1.2,1.3,2.2 -12 -21 <(sort -t, -k2 file2) <(sort file1) 
group1,pathway1,2,3
group2,pathway2,1,4
group1,pathway2,3,4
group2,pathway3,2,5
group1,pathway4,5,6

join두 파일의 줄은 공통 필드에 연결됩니다. -o출력 형식을 설정합니다 . 여기서는 첫 번째 파일( 1.1,1.2,1.3)의 필드 1, 2, 3을 인쇄한 다음 두 번째 파일( )의 두 번째 필드를 인쇄 하도록 지시합니다 2.2. 그리고 각 파일에 연결 필드를 설정합니다 -1. -2즉, -12 -21"file1의 두 번째 필드와 file2의 첫 번째 필드를 결합한다"는 의미입니다. 마지막으로 join입력을 정렬해야 하므로 두 파일을 모두 join.

답변2

awk에서는 이것으로 충분합니다:

awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2

예제 파일은 공백으로 구분된 형식이며 위의 코드는 공백으로 구분된 파일에서 작동합니다.

file1 file2가 쉼표로 구분된 경우 다음을 수행할 수 있습니다.

awk 'BEGIN{FS=OFS=","}NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2

PS: awk에서 FS는 입력 필드 구분 기호에 해당하고 OFS는 출력 필드 구분 기호에 해당합니다. 기본 FS 및 OFS는 "공백"이며, 귀하의 경우 공백인 경우 생략할 수 있습니다(즉, 첫 번째 코드에서는 생략됨).

다양한 입력 필드 구분 기호와 다양한 출력 필드 구분 기호를 결합하려면 다음을 수행할 수 있습니다.

awk 'BEGIN{FS=" ";OFS=","}NR==FNR{a[$1]=$2;next};$1=$1{print $0,a[$2]}' file1 file2 
#The $1=$1 part is required to redisign the record according to the different Output Field Separator OFS

질문에 표시된 대로 공백으로 구분된 입력 파일과 쉼표로 구분된 출력이 있는 마지막 코드는 다음과 같습니다.

group1,pathway1,2,3                                                                                                                                                             
group1,pathway4,5,6                                                                                                                                                             
group1,pathway2,3,4                                                                                                                                                             
group2,pathway2,1,4                                                                                                                                                             
group2,pathway3,2,5

여기에서 온라인으로 테스트해보세요.

OFS="\t"추신: 공백으로 구분된 파일의 경우 더 아름다운 출력을 위해 (탭)을 지정할 수 있습니다 .

답변3

perl -lane '
 if ( @ARGV == 1 ) {
  $h{ $F[0] } = $F[1];
 } else {
  print "$_ $h{ $F[1] }";
 }
' file1 file2

관련 정보