Bash 使用涉及100+;柱

Bash 使用涉及100+;柱,bash,awk,paste,Bash,Awk,Paste,请仅浏览以下代码中丰富的手动输入,无需理解: #!/bin/bash paste A1.dat A2.dat A3.dat A4.dat A5.dat A6.dat > A.dat awk '{print ($2 + $21 + $40 + $59 + $78 + $97), ($3 + $22 + $41 + $60 + $79 + $98), ($4 + $23 + $42 + $61 + $80 + $99) + ($6 + $25 + $44 + $63 + $82 + $10

请仅浏览以下代码中丰富的手动输入,无需理解:

#!/bin/bash

paste A1.dat A2.dat A3.dat A4.dat A5.dat A6.dat > A.dat

awk '{print ($2 + $21 + $40 + $59 + $78 + $97), ($3 + $22 + $41 + $60 + $79 + $98), ($4 + $23 + $42 + $61 + $80 + $99) + ($6 + $25 + $44 + $63 + $82 + $101) + ($8 + $27 + $46 + $65 + $84 + $103), ($5 + $24 + $43 + $62 + $81 + $100) + ($7 + $26 + $45 + $64 + $83 + $102) + ($9 + $ 28 + $47 + $66 + $85 + $104), ($10 + $29 + $48 + $67 + $86 + $105) + ($12 + $31 + $50 + $69 + $88 + $107) + ($14 + $33 + $52 + $71 + $90 + $109) + ($16 + $35 + $54 + $73 + $92 + $111) + ($18 + $37 + $56 + $75 + $94 + $113), ($11 + $30 + $49 + $68 + $87 + $106) + ($13 + $32 + $51 + $70 + $89 + $108) + ($15 + $34 + $53 + $72 + $91 + $110) + ($17 + $36 + $55 + $74 + $93 + $112) + ($19 + $38 + $57 + $76 + $95 + $114)}' A.dat >> A_full.dat
编码目标:获取存储在n输入文件中的数据,每个文件包含19列数据和相等的行。以某种方式操作这些数据,生成一个包含7列数据和与每个输入文件相同行的输出文件

我在上面代码中所做的:使用
paste
将所有n个输入文件(A?.dat)合并为1个文件(A.dat)。接下来,我使用
awk
操作A.dat中的数据以获得输出文件(A_full.dat)。对于较大的n值,这将变得难以控制和麻烦

我的请求:帮助我概括
n
的任何值的代码。我上面发布的代码是用于n=6时的。要了解代码的数据操作功能,请查看下面的代码n=2(请参见示例文件后面的说明):

示例文件:

#!/bin/bash

paste A1.dat A2.dat > A.dat

awk '{print $1, ($2 + $21), ($3 + $22), ($4 + $23) + ($6 + $25) + ($8 + $27), ($5 + $24) + ($7 + $26) + ($9 + $28), ($10 + $29) + ($12 + $31) + ($14 + $33) + ($16 + $35 ) + ($18 + $37), ($11 + $30) + ($13 + $32) + ($15 + $34) + ($17 + $36) + ($19 + $38)}' A.dat >> A_full.dat
A1.dat:

-0.908  0.3718E-03  0.2227E-02  0.1216E-05  0.6719E-05  0.1697E-05  0.1052E-04  0.1697E-05  0.1052E-04  0.5774E-07  0.3360E-06  0.5774E-07  0.3360E-06  0.5418E-06  0.3169E-05  0.1972E-06  0.1099E-05  0.1610E-05  0.9417E-05
-0.902  0.1042E-02  0.3365E-02  0.3427E-05  0.1021E-04  0.4837E-05  0.1619E-04  0.4837E-05  0.1619E-04  0.1623E-06  0.5093E-06  0.1623E-06  0.5093E-06  0.1522E-05  0.4803E-05  0.5530E-06  0.1661E-05  0.4522E-05  0.1427E-04
-0.895  0.1962E-02  0.4677E-02  0.6479E-05  0.1428E-04  0.9232E-05  0.2289E-04  0.9232E-05  0.2289E-04  0.3064E-06  0.7100E-06  0.3064E-06  0.7100E-06  0.2870E-05  0.6694E-05  0.1042E-05  0.2310E-05  0.8530E-05  0.1988E-04
-0.889  0.3067E-02  0.6167E-02  0.1019E-04  0.1893E-04  0.1470E-04  0.3064E-04  0.1470E-04  0.3064E-04  0.4806E-06  0.9388E-06  0.4806E-06  0.9388E-06  0.4500E-05  0.8850E-05  0.1629E-05  0.3047E-05  0.1337E-04  0.2629E-04
A2.dat:

-0.908  0.9081E-04  0.5463E-03  0.9126E-05  0.5564E-04  0.4880E-06  0.3004E-05  0.4880E-06  0.3004E-05  0.2218E-06  0.1311E-05  0.2218E-06  0.1311E-05  0.1433E-06  0.8079E-06  0.1452E-06  0.8808E-06  0.4262E-06  0.2402E-05
-0.902  0.2531E-03  0.8191E-03  0.2580E-04  0.8502E-04  0.1377E-05  0.4565E-05  0.1377E-05  0.4565E-05  0.6264E-06  0.2000E-05  0.6264E-06  0.2000E-05  0.3994E-06  0.1211E-05  0.4063E-06  0.1327E-05  0.1188E-05  0.3599E-05
-0.895  0.4742E-03  0.1130E-02  0.4894E-04  0.1194E-03  0.2604E-05  0.6378E-05  0.2604E-05  0.6378E-05  0.1187E-05  0.2805E-05  0.1187E-05  0.2805E-05  0.7483E-06  0.1670E-05  0.7638E-06  0.1839E-05  0.2225E-05  0.4963E-05
-0.889  0.7357E-03  0.1480E-02  0.7735E-04  0.1591E-03  0.4094E-05  0.8448E-05  0.4094E-05  0.8448E-05  0.1874E-05  0.3729E-05  0.1874E-05  0.3729E-05  0.1161E-05  0.2186E-05  0.1191E-05  0.2419E-05  0.3452E-05  0.6496E-05
A.dat:

-0.908  0.3718E-03  0.2227E-02  0.1216E-05  0.6719E-05  0.1697E-05  0.1052E-04  0.1697E-05  0.1052E-04  0.5774E-07  0.3360E-06  0.5774E-07  0.3360E-06  0.5418E-06  0.3169E-05  0.1972E-06  0.1099E-05  0.1610E-05  0.9417E-05       -0.908  0.9081E-04  0.5463E-03  0.9126E-05  0.5564E-04  0.4880E-06  0.3004E-05  0.4880E-06  0.3004E-05  0.2218E-06  0.1311E-05  0.2218E-06  0.1311E-05  0.1433E-06  0.8079E-06  0.1452E-06  0.8808E-06  0.4262E-06  0.2402E-05
-0.902  0.1042E-02  0.3365E-02  0.3427E-05  0.1021E-04  0.4837E-05  0.1619E-04  0.4837E-05  0.1619E-04  0.1623E-06  0.5093E-06  0.1623E-06  0.5093E-06  0.1522E-05  0.4803E-05  0.5530E-06  0.1661E-05  0.4522E-05  0.1427E-04       -0.902  0.2531E-03  0.8191E-03  0.2580E-04  0.8502E-04  0.1377E-05  0.4565E-05  0.1377E-05  0.4565E-05  0.6264E-06  0.2000E-05  0.6264E-06  0.2000E-05  0.3994E-06  0.1211E-05  0.4063E-06  0.1327E-05  0.1188E-05  0.3599E-05
-0.895  0.1962E-02  0.4677E-02  0.6479E-05  0.1428E-04  0.9232E-05  0.2289E-04  0.9232E-05  0.2289E-04  0.3064E-06  0.7100E-06  0.3064E-06  0.7100E-06  0.2870E-05  0.6694E-05  0.1042E-05  0.2310E-05  0.8530E-05  0.1988E-04       -0.895  0.4742E-03  0.1130E-02  0.4894E-04  0.1194E-03  0.2604E-05  0.6378E-05  0.2604E-05  0.6378E-05  0.1187E-05  0.2805E-05  0.1187E-05  0.2805E-05  0.7483E-06  0.1670E-05  0.7638E-06  0.1839E-05  0.2225E-05  0.4963E-05
-0.889  0.3067E-02  0.6167E-02  0.1019E-04  0.1893E-04  0.1470E-04  0.3064E-04  0.1470E-04  0.3064E-04  0.4806E-06  0.9388E-06  0.4806E-06  0.9388E-06  0.4500E-05  0.8850E-05  0.1629E-05  0.3047E-05  0.1337E-04  0.2629E-04       -0.889  0.7357E-03  0.1480E-02  0.7735E-04  0.1591E-03  0.4094E-05  0.8448E-05  0.4094E-05  0.8448E-05  0.1874E-05  0.3729E-05  0.1874E-05  0.3729E-05  0.1161E-05  0.2186E-05  0.1191E-05  0.2419E-05  0.3452E-05  0.6496E-05
A_full.dat:

-0.908 0.00046261 0.0027733 1.4712e-05 8.9407e-05 3.62278e-06 2.10697e-05
-0.902 0.0012951 0.0041841 4.1655e-05 0.00013674 1.01681e-05 3.18896e-05
-0.895 0.0024362 0.005807 7.9091e-05 0.000192216 1.91659e-05 4.4386e-05
-0.889 0.0038027 0.007647 0.000125128 0.000256206 3.00122e-05 5.86236e-05
关于输出文件(A_full.dat)7列的更多信息

  • 所有输入A?.dat文件在列1中具有相同的值。A_full.dat也必须具有相同的列1
  • A_full.dat的第2列应为所有A?.dat文件第2列的总和
  • A_full.dat的第3列应为所有A?.dat文件第3列的总和
  • A_full.dat的第4列应该是所有Afull.dat文件的第4、6和8列的总和
  • A_full.dat的第5列应该是所有A_full.dat文件的第5、7和9列的总和
  • A_full.dat的第6列应该是所有A_full.dat文件的第10、12、14、16和18列的总和
  • A_full.dat的第7列应该是所有A_full.dat文件的第11、13、15、17和19列的总和

起初,我以一种令人困惑的方式发布了这个问题,但在@markp fuso输入的帮助下,我对其进行了编辑,使其更易于理解。

注意:根据OPs最新更改(包括输出中的字段$1)进行了更新,并合并了EdMorton对
awk/for
循环的建议


根据OP当前的
awk
命令

awk '{print ($2 + $21 + $40 + $59 + $78 + $97), ($3 + $22 + $41 + $60 + $79 + $98), ($4 + $23 + $42 + $61 + $80 + $99) + ($6 + $25 + $44 + $63 + $82 + $101) + ($8 + $27 + $46 + $65 + $84 + $103), ($5 + $24 + $43 + $62 + $81 + $100) + ($7 + $26 + $45 + $64 + $83 + $102) + ($9 + $ 28 + $47 + $66 + $85 + $104), ($10 + $29 + $48 + $67 + $86 + $105) + ($12 + $31 + $50 + $69 + $88 + $107) + ($14 + $33 + $52 + $71 + $90 + $109) + ($16 + $35 + $54 + $73 + $92 + $111) + ($18 + $37 + $56 + $75 + $94 + $113), ($11 + $30 + $49 + $68 + $87 + $106) + ($13 + $32 + $51 + $70 + $89 + $108) + ($15 + $34 + $53 + $72 + $91 + $110) + ($17 + $36 + $55 + $74 + $93 + $112) + ($19 + $38 + $57 + $76 + $95 + $114)}' A.dat >> A_full.dat
。。。除了各种各样的评论和编辑之外,我还提供了以下内容:

  • 所有输入文件都有19个字段
  • 所有输入文件的行数相同
  • 不确定如何处理字段#1(由于问题编辑和解释混乱)
  • 所需输出由每组输入行的7x列组成(
    col1
    col7
  • col1
    :从第一个文件复制字段#1(所有输入文件中的字段#1应相同)
  • col2
    :所有输入文件中字段#2的总和
  • col3
    :(否定)所有输入文件中字段#3的总和
  • col4
    :所有输入文件中字段#4、#6和#8的总和
  • col5
    :(否定)所有输入文件中字段#5、#7和#9的总和
  • col6
    :所有输入文件中字段#10、#12、#14、#16和#18的总和
  • col7
    :所有输入文件中字段#11、#13、#15、#17和#19的总和
  • 现在,我假设我们希望输出行按照从输入文件读取它们的相同顺序排序(即,input NR==output NR)
  • OP需要一个能够处理
    n
    数量的输入文件的解决方案
我建议让
awk
读取单个数据文件(
a.dat
)并“动态”累积所需的数据值,而不是
paste
(将
n
输入文件粘贴到单个大文件(
a.dat
)中,然后让
awk
解析
nx19

一个
awk
解决方案:

awk '
FNR==NR { col1[FNR]=$1 }
        { col2[FNR]+=($2)
          col3[FNR]-=($3)
          col4[FNR]+=($4 + $6 + $8)
          col5[FNR]-=($5 + $7 + $9)
          col6[FNR]+=($10 + $12 + $14 + $16 + $18)
          col7[FNR]+=($11 + $13 + $15 + $17 + $19)
        }
END     { for ( i=1 ; i <= FNR ; i++ )
              printf "%s %7.5f %7.5f %8.6f %8.6f %d %d\n", col1[i], col2[i], col3[i], col4[i], col5[i], col6[i], col7[i]
    }
' A1.dat A2.dat A3.dat ... An.dat
针对这2个输入文件运行建议的
awk
解决方案会生成:

$ awk '{ col1[FNR]+= .... }' A1.dat A2.dat
4.429 0.07953 -0.07312 0.052166 -0.046635 0 0
4.436 0.07590 -0.07248 0.050211 -0.046126 0 0
4.442 0.07225 -0.07289 0.048005 -0.045892 0 0
4.449 0.06906 -0.07584 0.046088 -0.047319 0 0

注意:根据OPs最新更改(包括输出中的字段$1)进行更新,并纳入EdMorton对
awk/for
循环的建议


根据OP当前的
awk
命令

awk '{print ($2 + $21 + $40 + $59 + $78 + $97), ($3 + $22 + $41 + $60 + $79 + $98), ($4 + $23 + $42 + $61 + $80 + $99) + ($6 + $25 + $44 + $63 + $82 + $101) + ($8 + $27 + $46 + $65 + $84 + $103), ($5 + $24 + $43 + $62 + $81 + $100) + ($7 + $26 + $45 + $64 + $83 + $102) + ($9 + $ 28 + $47 + $66 + $85 + $104), ($10 + $29 + $48 + $67 + $86 + $105) + ($12 + $31 + $50 + $69 + $88 + $107) + ($14 + $33 + $52 + $71 + $90 + $109) + ($16 + $35 + $54 + $73 + $92 + $111) + ($18 + $37 + $56 + $75 + $94 + $113), ($11 + $30 + $49 + $68 + $87 + $106) + ($13 + $32 + $51 + $70 + $89 + $108) + ($15 + $34 + $53 + $72 + $91 + $110) + ($17 + $36 + $55 + $74 + $93 + $112) + ($19 + $38 + $57 + $76 + $95 + $114)}' A.dat >> A_full.dat
。。。除了各种各样的评论和编辑之外,我还提供了以下内容:

  • 所有输入文件都有19个字段
  • 所有输入文件的行数相同
  • 不确定如何处理字段#1(由于问题编辑和解释混乱)
  • 所需输出由每组输入行的7x列组成(
    col1
    col7
  • col1
    :从第一个文件复制字段#1(所有输入文件中的字段#1应相同)
  • col2
    :所有输入文件中字段#2的总和
  • col3
    :(否定)所有输入文件中字段#3的总和
  • col4
    :所有输入文件中字段#4、#6和#8的总和
  • col5
    :(否定)所有输入文件中字段#5、#7和#9的总和
  • col6
    :所有输入文件中字段#10、#12、#14、#16和#18的总和
  • col7
    :所有输入文件中字段#11、#13、#15、#17和#19的总和
  • 现在,我假设我们希望输出行按照从输入文件读取它们的相同顺序排序(即,input NR==output NR)
  • OP需要一个能够处理
    n
    数量的输入文件的解决方案
我建议让
awk
读取单个数据文件(
a.dat
)并“动态”累积所需的数据值,而不是
paste
(将
n
输入文件粘贴到单个大文件(
a.dat
)中,然后让
awk
解析
nx19

一个
awk
解决方案:

awk '
FNR==NR { col1[FNR]=$1 }
        { col2[FNR]+=($2)
          col3[FNR]-=($3)
          col4[FNR]+=($4 + $6 + $8)
          col5[FNR]-=($5 + $7 + $9)
          col6[FNR]+=($10 + $12 + $14 + $16 + $18)
          col7[FNR]+=($11 + $13 + $15 + $17 + $19)
        }
END     { for ( i=1 ; i <= FNR ; i++ )
              printf "%s %7.5f %7.5f %8.6f %8.6f %d %d\n", col1[i], col2[i], col3[i], col4[i], col5[i], col6[i], col7[i]
    }
' A1.dat A2.dat A3.dat ... An.dat
针对th运行建议的
awk
解决方案