파일 1: 엑셀 파일(.xls)
UN ID St M1 M2 SE DOF PV PA FC
17127159 0 -5.9 297.3 765.7 0.22 4 0.003 0.00389231 2.57536
17127163 2 -3.87 189.914 492.307 0.3548 4 0.0179 0.01795 2.59226
17127167 4 -3.8908 339.136 855.276 0.3429 4 0.0176 0.017 2.52192
17127171 6 -3.922 390.44 986.365 0.340 4 0.0172179 0.01721 2.52627
17127175 8 -4.715 536.072 1210.65 0.2492 4 0.00920158 0.00920 2.258
파일 2: 텍스트 파일(.txt)
UNIT_ID UN TID X E GG7 J O
0 17127159 16657436 353.568 335.295 221.717 815.654 684.85
1 17127161 16657436 11.0842 7.01459 7.33511 11.2121 12.6268
2 17127163 16657450 221.647 226.774 136.274 431.32 392.533
3 17127165 16657452 5.02182 3.41172 4.12834 6.90306 4.91183
첫 번째 파일의 첫 번째 열이 두 번째 파일의 두 번째 열과 일치하는 경우 두 번째 파일의 3열부터 9열까지 일치하는 행을 추출하여 첫 번째 파일에 저장합니다.
누가 날 도울 수 있죠?
출력은 새 파일에 저장되어야 합니다.
산출:
UN ID St M1 M2 SE DOF PV PA FC TID X E GG7 J O
17127159 0 -5.9 297.3 765.7 0.22 4 0.003 0.00389231 2.57536 16657436 353.568 335.295 221.717 815.654 684.85
답변1
해결책 awk
:
$ awk 'NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next}
{
if($1 in a){
print $0,a[$1]
}
}' file2 file1
UN ID St M1 M2 SE DOF PV PA FC TID X E GG7 J O
17127159 0 -5.9 297.3 765.7 0.22 4 0.003 0.00389231 2.57536 16657436 353.568 335.295 221.717 815.654 684.85
17127163 2 -3.87 189.914 492.307 0.3548 4 0.0179 0.01795 2.59226 16657450 221.647 226.774 136.274 431.32 392.533
설명하다
awk는 각 입력 행을 필드(기본적으로 비어 있음)로 분할하여 첫 번째 필드를 $1
두 번째 필드로 만드는 $2
식으로 진행됩니다. 특수 변수 NR
는 현재 입력 줄 번호이며, 이는 FNR
읽고 있는 파일의 현재 줄 번호이기도 합니다. 따라서 여러 파일을 처리하는 경우 첫 번째 파일을 읽을 때만 두 파일이 동일합니다.
NR==FNR{a[$2]=$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9; next}
: 첫 번째 파일을 읽는 경우 필드 3~9(탭으로 연결됨)를a
키가 두 번째 필드인 배열의 값으로 저장합니다. 그런 다음 해당next
라인으로 점프하세요.이렇게 하면
next
스크립트의 나머지 부분이file2
첫 번째 파일( )에 대해 실행되지 않고 두 번째 파일(file1
)에 대해서만 실행됩니다.if($1 in a){ print $0,a[$1] }
: 이제 두 번째 파일( )에 있습니다file1
. 첫 번째 필드가a
배열 ()의 키로 존재하는 경우 현재 행과if($1 in a)
필드 3 ~ 9에$0
저장된 값을 인쇄합니다.a
$1
file2