如何优化 awk 搜索和替换脚本

How to optimize awk search and replace script

问题来了。

我有一个文件,我需要在第一列和第二列中检查并用相应的 name/ID 替换数字实例。

有问题的文件看起来像这样,我们称之为 samples.txt:

a   b   nSites  J9  J8  J7  J6  J5  J4  J3  J2  J1  rab Fa  Fb  theta   inbred_relatedness_1_2  inbred_relatedness_2_1  fraternity  identity    zygosity    2of3_IDB    FDiff   loglh   nIter   bestoptimll coverage    2dsfs   R0  R1  KING    2dsfs_loglike   2dsfsf_niter
0   1   110869  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000001    0.000004    0.000000    0.000001    0.000000    0.000000    0.000001    0.000000    0.000001    0.000003    0.000001    -172458.670509  58  -172458.743214  0.999964    1.837844e-01,1.472857e-01,3.964455e-02,1.549278e-01,1.560343e-01,9.930636e-02,3.822848e-02,9.223201e-02,8.855644e-02    0.499076    0.272966    0.000358    -231585.329751  5
0   2   110862  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    -183086.681714  38  -183086.685699  0.999901    1.825920e-01,1.500752e-01,3.805942e-02,1.515067e-01,1.627393e-01,9.600464e-02,4.057636e-02,9.130610e-02,8.714018e-02    0.483201    0.286751    0.006714    -231450.057989  6
0   3   110862  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000003    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000001    0.000001    -183177.485139  45  -183177.507865  0.999901    1.829350e-01,1.450782e-01,4.270378e-02,1.540806e-01,1.580381e-01,9.817012e-02,4.022413e-02,9.105947e-02,8.771068e-02    0.524734    0.276621    -0.009718   -232160.853650  6
0   4   110865  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000001    0.000006    0.000001    0.000001    0.000000    0.000001    0.000000    0.000000    0.000000    0.000004    0.000003    -185038.457036  53  -185038.537727  0.999928    1.763022e-01,1.560086e-01,3.841510e-02,1.517147e-01,1.659002e-01,9.265872e-02,3.999819e-02,9.325335e-02,8.574894e-02    0.472653    0.290011    0.010993    -231288.726053  5
0   5   110865  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000002    0.000005    0.000002    0.000002    0.000002    0.000002    0.000000    0.000002    0.000002    0.000003    0.000001    -186050.631757  47  -186050.757441  0.999928    1.724535e-01,1.597864e-01,3.847920e-02,1.523892e-01,1.663541e-01,9.152108e-02,4.180401e-02,9.761899e-02,7.959339e-02    0.482604    0.286029    0.006939    -231368.083428  6
1   2   110866  0.175538    0.824462    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.412231    0.000000    0.000000    0.206115    0.000000    0.000000    0.000000    0.000000    0.000000    0.412231    0.000000    -159435.171396  126 -1  0.999937    2.600724e-01,1.168766e-01,1.398141e-05,1.145118e-01,1.969803e-01,8.406278e-02,3.143034e-07,9.043812e-02,1.370437e-01    0.000073    0.485288    0.246236    -207541.041229  13
1   3   110866  0.079102    0.920898    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.460449    0.000000    0.000000    0.230225    0.000000    0.000000    0.000000    0.000000    0.000000    0.460449    0.000000    -158580.390547  134 -1  0.999937    2.647743e-01,1.121666e-01,1.169660e-05,1.124294e-01,1.954374e-01,8.770696e-02,1.354863e-05,8.664493e-02,1.408153e-01    0.000129    0.489851    0.247381    -206817.111836  13
1   4   110869  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000001    0.000000    0.000002    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000002    -0.000001   -165161.382582  46  -165161.438820  0.999964    1.746199e-01,1.620008e-01,4.033822e-02,1.490423e-01,1.539301e-01,9.257268e-02,4.436021e-02,9.920260e-02,8.393319e-02    0.550240    0.262001    -0.019079   -232444.799468  5
1   5   110869  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000001    -0.000000   -166172.116239  54  -166172.136306  0.999964    1.753381e-01,1.619384e-01,3.967325e-02,1.464603e-01,1.606635e-01,8.843158e-02,4.485591e-02,1.011443e-01,8.149469e-02    0.526125    0.275815    -0.010246   -232079.896156  5
2   3   110860  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000001    0.000001    0.000001    0.000001    0.000001    0.000001    0.000000    0.000001    0.000001    0.000001    -0.000000   -173932.994973  42  -173933.036121  0.999883    1.866618e-01,1.443290e-01,4.370005e-02,1.507040e-01,1.596694e-01,9.379667e-02,3.991130e-02,9.013509e-02,9.109267e-02    0.523653    0.283818    -0.009462   -232151.462292  6
2   4   110864  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    -175792.304256  98  -175792.304466  0.999919    1.732800e-01,1.590686e-01,4.234024e-02,1.535167e-01,1.620891e-01,8.853151e-02,4.122604e-02,9.397397e-02,8.597382e-02    0.515558    0.280113    -0.006156   -231990.297434  6
2   5   110862  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    -176798.506531  90  -176798.512845  0.999901    1.710777e-01,1.636463e-01,3.995366e-02,1.531499e-01,1.614073e-01,8.958210e-02,4.242638e-02,9.869295e-02,8.006375e-02    0.510386    0.274759    -0.004050   -231742.876506  6
3   4   110863  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000003    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000002    0.000001    -175883.748337  54  -175883.792877  0.999910    1.738435e-01,1.626377e-01,4.081213e-02,1.500631e-01,1.501179e-01,9.394541e-02,4.411551e-02,1.024025e-01,8.206222e-02    0.565739    0.252734    -0.024389   -232587.265425  6
3   5   110862  1.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000001    0.000000    0.000001    0.000001    -0.000000   -176893.423638  66  -176893.448036  0.999901    1.741417e-01,1.618187e-01,4.133086e-02,1.465582e-01,1.591761e-01,8.839478e-02,4.595996e-02,1.027492e-01,7.987048e-02    0.548392    0.271256    -0.018836   -232451.945313  6
4   5   110867  0.175600    0.824400    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.000000    0.412200    0.000000    0.000000    0.206100    0.000000    0.000000    0.000000    0.000000    0.000000    0.412200    -0.000000   -173922.125305  82  -1  0.999946    2.436631e-01,1.243375e-01,5.833181e-08,1.229663e-01,2.042798e-01,8.790167e-02,6.085541e-07,9.511358e-02,1.217374e-01    0.000003    0.474716    0.243514    -208520.938655  9

这是我目前的解决方案,它是一个 bash 脚本文件,我在要修改的文件上调用该脚本文件。 \

示例:bash change-column-value.sh samples.txt

FILE=
function main {
  awk -v search= -v replace= ' == search {  = replace }1' $FILE > tmp
  awk -v search= -v replace= ' == search {  = replace }1' tmp > $FILE
  rm tmp
}

main 0 A0081.bam
main 1 A0082.bam
main 3 A0083.bam
main 4 A0084.bam
main 5 A0085.bam
main 6 A0086.bam

最终结果:

a   b   nSites  J9  J8  J7  J6  J5  J4  J3  J2  J1  rab Fa  Fb  theta   inbred_relatedness_1_2  inbred_relatedness_2_1  fraternity  identity    zygosity    2of3_IDB    FDiff   loglh   nIter   bestoptimll coverage    2dsfs   R0  R1  KING    2dsfs_loglike   2dsfsf_niter
A0081.bam A0082.bam 110869 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000004 0.000000 0.000001 0.000000 0.000000 0.000001 0.000000 0.000001 0.000003 0.000001 -172458.670509 58 -172458.743214 0.999964 1.837844e-01,1.472857e-01,3.964455e-02,1.549278e-01,1.560343e-01,9.930636e-02,3.822848e-02,9.223201e-02,8.855644e-02 0.499076 0.272966 0.000358 -231585.329751 5
A0081.bam A0083.bam 110862 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -183086.681714 38 -183086.685699 0.999901 1.825920e-01,1.500752e-01,3.805942e-02,1.515067e-01,1.627393e-01,9.600464e-02,4.057636e-02,9.130610e-02,8.714018e-02 0.483201 0.286751 0.006714 -231450.057989 6
A0081.bam A0084.bam 110862 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000001 -183177.485139 45 -183177.507865 0.999901 1.829350e-01,1.450782e-01,4.270378e-02,1.540806e-01,1.580381e-01,9.817012e-02,4.022413e-02,9.105947e-02,8.771068e-02 0.524734 0.276621 -0.009718 -232160.853650 6
A0081.bam A0085.bam 110865 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000006 0.000001 0.000001 0.000000 0.000001 0.000000 0.000000 0.000000 0.000004 0.000003 -185038.457036 53 -185038.537727 0.999928 1.763022e-01,1.560086e-01,3.841510e-02,1.517147e-01,1.659002e-01,9.265872e-02,3.999819e-02,9.325335e-02,8.574894e-02 0.472653 0.290011 0.010993 -231288.726053 5
A0081.bam A0086.bam 110865 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000002 0.000005 0.000002 0.000002 0.000002 0.000002 0.000000 0.000002 0.000002 0.000003 0.000001 -186050.631757 47 -186050.757441 0.999928 1.724535e-01,1.597864e-01,3.847920e-02,1.523892e-01,1.663541e-01,9.152108e-02,4.180401e-02,9.761899e-02,7.959339e-02 0.482604 0.286029 0.006939 -231368.083428 6
A0082.bam A0083.bam 110866 0.175538 0.824462 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.412231 0.000000 0.000000 0.206115 0.000000 0.000000 0.000000 0.000000 0.000000 0.412231 0.000000 -159435.171396 126 -1 0.999937 2.600724e-01,1.168766e-01,1.398141e-05,1.145118e-01,1.969803e-01,8.406278e-02,3.143034e-07,9.043812e-02,1.370437e-01 0.000073 0.485288 0.246236 -207541.041229 13
A0082.bam A0084.bam 110866 0.079102 0.920898 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.460449 0.000000 0.000000 0.230225 0.000000 0.000000 0.000000 0.000000 0.000000 0.460449 0.000000 -158580.390547 134 -1 0.999937 2.647743e-01,1.121666e-01,1.169660e-05,1.124294e-01,1.954374e-01,8.770696e-02,1.354863e-05,8.664493e-02,1.408153e-01 0.000129 0.489851 0.247381 -206817.111836 13
A0082.bam A0085.bam 110869 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000002 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000002 -0.000001 -165161.382582 46 -165161.438820 0.999964 1.746199e-01,1.620008e-01,4.033822e-02,1.490423e-01,1.539301e-01,9.257268e-02,4.436021e-02,9.920260e-02,8.393319e-02 0.550240 0.262001 -0.019079 -232444.799468 5
A0082.bam A0086.bam 110869 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 -0.000000 -166172.116239 54 -166172.136306 0.999964 1.753381e-01,1.619384e-01,3.967325e-02,1.464603e-01,1.606635e-01,8.843158e-02,4.485591e-02,1.011443e-01,8.149469e-02 0.526125 0.275815 -0.010246 -232079.896156 5
A0083.bam A0084.bam 110860 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000001 0.000001 0.000001 0.000001 0.000001 0.000000 0.000001 0.000001 0.000001 -0.000000 -173932.994973 42 -173933.036121 0.999883 1.866618e-01,1.443290e-01,4.370005e-02,1.507040e-01,1.596694e-01,9.379667e-02,3.991130e-02,9.013509e-02,9.109267e-02 0.523653 0.283818 -0.009462 -232151.462292 6
A0083.bam A0085.bam 110864 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -175792.304256 98 -175792.304466 0.999919 1.732800e-01,1.590686e-01,4.234024e-02,1.535167e-01,1.620891e-01,8.853151e-02,4.122604e-02,9.397397e-02,8.597382e-02 0.515558 0.280113 -0.006156 -231990.297434 6
A0083.bam A0086.bam 110862 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -176798.506531 90 -176798.512845 0.999901 1.710777e-01,1.636463e-01,3.995366e-02,1.531499e-01,1.614073e-01,8.958210e-02,4.242638e-02,9.869295e-02,8.006375e-02 0.510386 0.274759 -0.004050 -231742.876506 6
A0084.bam A0085.bam 110863 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000002 0.000001 -175883.748337 54 -175883.792877 0.999910 1.738435e-01,1.626377e-01,4.081213e-02,1.500631e-01,1.501179e-01,9.394541e-02,4.411551e-02,1.024025e-01,8.206222e-02 0.565739 0.252734 -0.024389 -232587.265425 6
A0084.bam A0086.bam 110862 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000001 0.000000 0.000001 0.000001 -0.000000 -176893.423638 66 -176893.448036 0.999901 1.741417e-01,1.618187e-01,4.133086e-02,1.465582e-01,1.591761e-01,8.839478e-02,4.595996e-02,1.027492e-01,7.987048e-02 0.548392 0.271256 -0.018836 -232451.945313 6
A0085.bam A0086.bam 110867 0.175600 0.824400 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.412200 0.000000 0.000000 0.206100 0.000000 0.000000 0.000000 0.000000 0.000000 0.412200 -0.000000 -173922.125305 82 -1 0.999946 2.436631e-01,1.243375e-01,5.833181e-08,1.229663e-01,2.042798e-01,8.790167e-02,6.085541e-07,9.511358e-02,1.217374e-01 0.000003 0.474716 0.243514 -208520.938655 9

原样,此解决方案有效,但感觉效率低下。 有没有一种方法可以只调用 Awk 一次,但可以随意修改文件?

要在单个 awk 调用中完成所有替换,您可以这样做:

awk -v from='0 1 2 3 4 5' -v to='A0081.bam A0082.bam A0083.bam A0084.bam A0085.bam A0086.bam' '
    BEGIN {
        fromCount = split(from, fromArr)
        toCount = split(to, toArr)
        for (i = 1; i <= fromCount; i++)
            tr[fromArr[i]] = toArr[i]
    }
     in tr {  = tr[] }
     in tr {  = tr[] }
    1
' samples.txt