Linux에서 한 줄을 다른 줄로 바꾸는 방법

Linux에서 한 줄을 다른 줄로 바꾸는 방법

파일 1이 있습니다.

 A1  1  NA
 A1  2  NA
 A1  3  NA
 A1  4  A
 A1  5  G
 A1  6  T
 A1  7  NA
 A1  8  NA
 A1  9  NA
 A2  1  NA
 A2  2  NA
 A2  3  T
 A2  4  NA

파일 2:

A1  4  A
A1  5  B
A1  6  T
A2  3  T

파일 1의 A2의 행 번호 4,5,6 및 3을 파일 2의 값 4,5,6 및 3으로 바꾸고 싶습니다.

새 파일 3의 예상 출력:-

A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  B
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

파일 1에는 파일 1의 열 1(A1~A13 값)의 각 값에 대해 100,000개의 행이 있습니다. 예시만 보여드렸습니다. 파일 2에는 파일 1의 몇 줄만 포함되어 있으며 파일 2의 열 3에 있는 값이 변경됩니다.

Linux나 Python에서 이것을 시도하고 싶습니다. 사실 이미 누군가가 답변을 게시했습니다. 대답은 매우 좋습니다.

awk 및 python q 명령을 사용해 보았지만 문제를 해결할 수 없었습니다. 결과를 얻는 데 시간이 오래 걸리고 결과 파일이 0바이트입니다.

12시간 동안 그대로 놔두었지만 여전히 결과가 나오지 않았습니다.

내 원본 데이터의 몇 행

파일 1

 A01  1  C
 A01  2  T
 A01  3  A
 A01  4  A
 A01  5  A
 A01  6  A
 A01  7  C
 A01  8  A
 A01  9  C
 A01  10  G
 A01  11  C
 A01  12  G
 A01  13  G
 A01  14  A
 A01  15  T
 A01  16  C
 A01  17  C
 A01  18  T
 A01  19  T
 A01  20  C
 A01  21  G
 A01  22  G
 A01  23  G
 A01  24  T
 A01  25  C
 A01  26  G
 A01  27  G
 A01  28  G
 A01  29  T
 A01  30  C
 A01  31  G
  .
  .
  .
 A01 60534289  T

파일 2

 A01  905  T
 A01  911  A
 A01  922  C
 A01  953  C
 A01  967  T
 A01  979  C
 A01  1046  T
 A01  1160  G
 A01  1165  T
 A01  1167  T
 A01  1171  C
 A01  1282  A
 A01  1382  T
 A01  1408  C
 A01  1743  T
 A01  1804  C
 A01  3089  G
 A01  3109  T
 A01  3243  A
 A01  3276  T
 A01  3302  T
 A01  3356  G
 A01  3373  G
 A01  3399  G
 A01  3631  C
 A01  3677  G
 A01  3682  G
 .
 .
 .
 A01  605342 B

따라서 파일 2에서 T가 위치 905에 있는 경우

 A01  905  T

파일 1에서 위치 905가 B인 경우

 A01  905  B

file1이 있다고 가정하면 다른 위치 값을 변경한다는 의미에서 다른 위치 값을 변경하지 않고 file1의 특정 위치에서 B를 T로 바꿔야 합니다.

A01   10905  C 

따라서 파일 1의 이 위치에 대해 10인 경우에만905file2에 다른 문자가 있습니까?

답변1

아직 여기에 댓글을 추가할 수 없으므로 여기에 내 awk솔루션이 있습니다.여기예시 입력 및 출력에 대해 테스트했습니다.

cat file1 file2 | awk '
    BEGIN { OFS = "  " }
    { rows[$1 OFS $2] = $3 }
    END { for (r in rows) print(r, rows[r]) }
' | sort -V >file3

이 답변이나 게시된 다른 답변을 시도해 보셨나요? 이렇게 하면 예상하지 못한 실제 출력이 무엇이었나요? 대답이 효과가 없으면 데이터 파일 형식에 대한 추가 정보를 제공하는 것이 도움이 될 수 있습니다.

답변2

Awk해결책:

awk 'NR == FNR{ a[$1, $2] = $3; next }
     ($1, $2) in a{ $3 = a[$1, $2] }1' file2 OFS='  ' file1

산출:

A1  1  NA
A1  2  NA
A1  3  NA
A1  4  A
A1  5  B
A1  6  T
A1  7  NA
A1  8  NA
A1  9  NA
A2  1  NA
A2  2  NA
A2  3  T
A2  4  NA

관련 정보