다른 열의 식별자와 일치하는 값이 있는 열 추가

다른 열의 식별자와 일치하는 값이 있는 열 추가

두 개의 파일이 있습니다.

파일 1

hc          Value
cluster0    0.1  
cluster0    0.2  
cluster0    0.3  
cluster1    0.3  
cluster1    0.5  
cluster0    0.8  
cluster2    0.9  
cluster2    0.9  
cluster0    0.0  

파일 2

hc       mean
cluster0 0.35
cluster1 0.4   
cluster2 0.9

그리고 다음과 같은 새 테이블을 만들고 싶습니다.

파일 3

hc          Value  mean
cluster0    0.1   0.35 
cluster0    0.2   0.35 
cluster0    0.3   0.35 
cluster1    0.3   0.40 
cluster1    0.5   0.40
cluster0    0.8   0.35 
cluster2    0.9   0.90
cluster2    0.9   0.90
cluster0    0.0   0.35

Bash에서 어떻게 할 수 있나요? 이 작업을 쉽게 수행할 수 있는 명령이 있습니까?

답변1

Awk에서는 쉽게 할 수 있습니다:

$ awk 'NR==FNR {a[$1] = FNR==1 ? $2 : sprintf("%.2f",$2); next} {print $0,a[$1]}' File2 File1
hc          Value mean
cluster0    0.1   0.35
cluster0    0.2   0.35
cluster0    0.3   0.35
cluster1    0.3   0.40
cluster1    0.5   0.40
cluster0    0.8   0.35
cluster2    0.9   0.90
cluster2    0.9   0.90
cluster0    0.0   0.35

단계는 다음과 같습니다.

  • 첫 번째 명명된 파일( NR==FNR)의 줄에 대해 첫 번째 열 값으로 인덱싱되고 두 번째 열(평균) 값을 포함하는 연관 배열(또는 해시)을 만듭니다. 평균값을 부동 소수점 형식으로 표시할 필요가 없으면 NR==FNR {a[$1] = $2}모든 값(헤더 포함)을 문자열로 처리하는 이 단계를 단순화할 수 있습니다.

  • 그렇지 않으면, 인덱스가 첫 번째 열과 일치하는 배열의 값이 뒤에 오는 행을 인쇄합니다.

답변2

아래 스크립트로 시도했지만 잘 작동했습니다.

명령

for i in `cat file2| awk '{print $1}'`; do p=`grep "$i" file2| awk '{print $2}'`; awk -v i="$i" -v p="$p" '$1 == i {$3=p;print $0}' file1; done|sed '1i hc      Value  mean'

산출

hc          Value  mean
cluster0    0.1   0.35 
cluster0    0.2   0.35 
cluster0    0.3   0.35 
cluster1    0.3   0.40 
cluster1    0.5   0.40
cluster0    0.8   0.35 
cluster2    0.9   0.90
cluster2    0.9   0.90
cluster0    0.0   0.35

관련 정보