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
:从第一个文件复制字段#1(所有输入文件中的字段#1应相同)col1
:所有输入文件中字段#2的总和col2
:(否定)所有输入文件中字段#3的总和col3
:所有输入文件中字段#4、#6和#8的总和col4
:(否定)所有输入文件中字段#5、#7和#9的总和col5
:所有输入文件中字段#10、#12、#14、#16和#18的总和col6
:所有输入文件中字段#11、#13、#15、#17和#19的总和col7
- 现在,我假设我们希望输出行按照从输入文件读取它们的相同顺序排序(即,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
:从第一个文件复制字段#1(所有输入文件中的字段#1应相同)col1
:所有输入文件中字段#2的总和col2
:(否定)所有输入文件中字段#3的总和col3
:所有输入文件中字段#4、#6和#8的总和col4
:(否定)所有输入文件中字段#5、#7和#9的总和col5
:所有输入文件中字段#10、#12、#14、#16和#18的总和col6
:所有输入文件中字段#11、#13、#15、#17和#19的总和col7
- 现在,我假设我们希望输出行按照从输入文件读取它们的相同顺序排序(即,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
解决方案