2016-12-27 7 views
0

私は、その列の5番目のフィールドにコンテキスト(パイプ|)があるときに、特定の列の最初のフィールド(たとえば1と2)の値を更新するファイルを持っています。特定の条件(コンテキスト)でのみ、別のフィールドの値を持つ列のフィールドの値を更新する方法はありますか。

私はpythonを使うことができますが、行を分割して値を代入して結合することは、長いスクリプトになります。私は解決策をawk(pefereable)を使用して探しています他の人はあまりにも短いです。また、これをPythonスクリプト内に埋め込みたいと思います。

以下は(:)で区切られた列内のフィールドを持つ私のデータからの2つの列です。

0/1:42,19:61:99:0|1:5185_T_TTCTATC:560,0,1648  0/1:38,34:72:99:0|1:5185_T_TTCTATC:1145,0,1311 

0/0:124,0,0:124:99:0,120,1800,120,1800,1800 0/0:165,0,0:165:99:0,120,1800,120,1800,1800 

0/0:152,0:152:99:.:.:0,120,1800 0/1:145,34:179:99:0|1:5398_A_G:973,0,6088 

ので、その列の5番目のフィールドがある場合 '|'最初のフィールドを5番目のフィールド値で更新します。

期待される結果:

0|1:42,19:61:99:0|1:5185_T_TTCTATC:560,0,1648  0|1:38,34:72:99:0|1:5185_T_TTCTATC:1145,0,1311 

0/0:124,0,0:124:99:0,120,1800,120,1800,1800 0/0:165,0,0:165:99:0,120,1800,120,1800,1800 

0/0:152,0:152:99:.:.:0,120,1800 0|1:145,34:179:99:0|1:5398_A_G:973,0,6088 

-Actually、列がたくさんあります。そして、この種の列は5番目のpythonのインデックス位置の後に表示され、5番目の列の後のすべての列フィールドで置換を行いたい場合は、どのように問題に近づけることができます。

おかげで、

おかげで、

+0

あなたはしかしawkの答えを提供していただけますか?それをPythonに組み込むことは別の問題であり、私は後でそれを扱います。ありがとう! – everestial007

+0

@エドモートン:awkソリューションを提供してもらえますか? – everestial007

+0

こんにちは@エドモートン:私は誰かがすぐに答えを提供することを願っています。しかし、時々私は数時間待たなければならず、明日から誰もそれをも​​う一度調べることはありません。 awkのソリューションを提供できるのであれば、少なくとも私のファイルで今したいことをやり遂げることができます。私はより完全な答えのために別の日を待つことができます。ありがとう! – everestial007

答えて

1
$ awk '{ for (i=1;i<=NF;i++) { split($i,f,/:/); if (f[5]~/\|/) sub(/^[^:]+/,f[5],$i) } }1' file 
0|1:42,19:61:99:0|1:5185_T_TTCTATC:560,0,1648 0|1:38,34:72:99:0|1:5185_T_TTCTATC:1145,0,1311 
0/0:124,0,0:124:99:0,120,1800,120,1800,1800 0/0:165,0,0:165:99:0,120,1800,120,1800,1800 
0/0:152,0:152:99:.:.:0,120,1800 0|1:145,34:179:99:0|1:5398_A_G:973,0,6088 

唯一の注意点は、サブにおける後方参照メタ文字であろうので、第5サブフィールド)が(& Sを含有しないことです。

第5列の置換を開始する場合は、ループ初期化部分でi = 1をi = 5に変更します。行に分割

$ awk '{ 
    for (i=1;i<=NF;i++) { 
     split($i,f,/:/) 
     if (f[5]~/\|/) 
      sub(/^[^:]+/,f[5],$i) 
    } 
}1' file 
+0

こんにちはエドモートン:これは置換のためにうまくいきました。しかし、特定の行では、列間のタブ区切り文字がスペースに変わりました。すべてのラインは実際には同じ構造をしています。私はそれがなぜ起こったのかを知ろうとしていますが、手がかりはありません。 – everestial007

+1

カラムがタブで区切られているとは決して言いませんでした。列を区切ることは、質問をするときに列に含まれる内容について話すことと同じくらい重要です。 '' {'を' 'BEGIN {FS = OFS =" \ t "} '{'に変更するとawkはタブをセパレータとして使うことを知っています。 –

+0

こんにちは@エドモートン:この 'awk'は実際に私の時間と実行時間の多くをかなり節約しました。私はそれをより分かりやすく理解できるように、答えにいくつかの説明を追加してください。私はawkのチュートリアルを見て、私に何かを教えています。再度、感謝します ! – everestial007

関連する問題