파일 1의 7, 8, 9열을 파일 2의 7, 8, 9열로 복사하여 새 파일 3을 만들었습니다. 생성된 파일(파일 3)이 원본 파일과 정렬되어 있지 않습니다. 정렬을 유지하려면 어떻게 편집해야 합니까?
나는 다음 명령을 사용했습니다.
awk '(getline line < "file 1") > -1 {split(line,a); $7 = a[7]; $8 = a[8]; $9= a[9]} 1' file 2 > file 3
파일 1:
GRM in vacuum
192700
1GRM C1 1 17.188 0.311 13.994 -0.5971 0.0204 -0.0724
1GRM C2 2 0.094 0.383 0.005 0.4831 -0.8709 -0.2204
1GRM C3 3 0.091 0.524 0.008 -0.7098 0.3449 -0.3952
파일 2:
GRM in vacuum
192760
1GRM C1 1 0.061 0.071 14.000
1GRM C2 2 0.184 0.142 14.000
1GRM C3 3 0.184 0.284 0.000
파일 3(출력):
GRM in vacuum
192760
1GRM C1 1 0.061 0.071 14.000 -0.5971 0.0204 -0.0724
1GRM C2 2 0.184 0.142 14.000 0.4831 -0.8709 -0.2204
1GRM C3 3 0.184 0.284 0.000 -0.7098 0.3449 -0.3952
정렬 문제를 해결하기 위해 다음을 사용했습니다.
awk 'BEGIN{fmt="%10s%9s%7d%8.3f%8.3f%8.3f%8.4f%8.4f%8.4f"} (getline line < "file 1") > -1 {n = split(line,a)} n > 6 {$0 = sprintf(fmt,$1,$2,$3,$4,$5,$6,a[7],a[8],a[9])} 1' "file 2" > file 3
하지만 아직 두 가지 질문이 있습니다.
첫 번째 문제는 출력 파일의 열이 원본 파일(파일 1 및 파일 2)과 다르게 정렬되어 있다는 것입니다.
두 번째 문제는 라인 10002에서 발생합니다. 열 2와 3이 함께 병합되어 라인 10002부터 끝까지의 전체 열이 출력 파일에서 사라집니다. 다음은 라인 10002에 있는 3개의 파일입니다.
파일 1:
2500GRM C3 9999 15.716 8.242 0.002 0.2372 -0.2989 -0.0758 # line 10001
2500GRM C410000 15.592 8.311 0.003 0.2603 -0.2492 -0.2394 # line 10002
2501GRM C110001 15.591 8.453 0.006 0.0887 -0.2458 -0.7014 # line 10003
2501GRM C210002 15.714 8.524 0.007 -0.0788 0.0598 -0.9619 # line 10004
파일 2:
2500GRM C3 9999 15.433 8.378 0.000 # line 10001
2500GRM C410000 15.310 8.449 0.000 # line 10002
2501GRM C110001 15.310 8.591 0.000 # line 10003
2501GRM C210002 15.433 8.662 0.000 # line 10004
파일 3:
2500GRM C3 9999 15.433 8.378 0.000 0.2372 -0.2989 -0.0758 # line 10001
2500GRM C410000 15.310 8.449 0.000 -0.2492 -0.2394 # line 10002
2501GRM C110001 15.310 8.591 0.000 -0.2458 -0.7014 # line 10003
2501GRM C210002 15.433 8.662 0.000 0.0598 -0.9619 # line 10004
다음 링크에 모든 파일을 첨부했습니다.
https://drive.google.com/drive/folders/13diMVxlp-T9BXE_jnm_LL1jUPbz8eren
답변1
문제는 에 8~9개의 데이터 필드가 있고 에 file1
5~6개의 데이터 필드가 있다는 것입니다 file2
. C3 9999
형식이 잘못된 필드이거나 두 필드 의 합 C410000
이어야 합니다 .C4
10000
필드 수에 따라 형식을 조정하려면 다음을 수행하십시오.
- 두 개의 형식 문자열 사용 및 둘 사이 전환
n
행을 분할하고 마지막 세 값을 가져올 때 배열 요소 수를 저장 합니다a[n-2]
.a[n-1]
a[n]
awk '
BEGIN{
fmt1="%8s %6s%5s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
fmt2="%8s %11s %7.3f %7.3f %7.3f %7.4f %7.4f %7.4f" ORS
}
(getline line < "file 1") > -1{
n=split(line, a)
}
NF<=3{ print; next } # print original line
NF==6{ printf fmt1, $1, $2, $3, $4, $5, $6, a[n-2], a[n-1], a[n]; next } # 6 + 3 fields
{ printf fmt2, $1, $2, $3, $4, $5, a[n-2], a[n-1], a[n] } # 5 + 3 fields
' "file 2" > "file 3"
산출:
...
2500GRM C3 9999 15.433 8.378 0.000 0.2372 -0.2989 -0.0758
2500GRM C410000 15.310 8.449 0.000 0.2603 -0.2492 -0.2394
2501GRM C110001 15.310 8.591 0.000 0.0887 -0.2458 -0.7014
2501GRM C210002 15.433 8.662 0.000 -0.0788 0.0598 -0.9619
...