Linuxで1行を別の行に置き換える方法

Linuxで1行を別の行に置き換える方法

ファイル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

この回答や投稿された他の回答を試しましたか?これで、予想外の実際の出力は何でしたか?答えがうまくいかない場合は、データファイルの種類に関する追加情報を提供することが役に立ちます。

おすすめ記事