Bash 如果目录中的文件长度不同,如何修改此awk操作?

Bash 如果目录中的文件长度不同,如何修改此awk操作?,bash,shell,awk,Bash,Shell,Awk,我必须捕获目录中所有文件的第9行,并形成一个矩阵。因此,最终的结果矩阵文件应该具有该目录中每个文件的最后一列(第9列)。我试图在下面使用这个awk命令,但似乎每列的行数已经固定。但是每列应该有不同的行长度 我怎样才能做到这一点 所以我为文件创建,每个文件中有不同的行长度 测试1 测试2 测试3 测试4 我使用的命令 awk -v OFS='\t' '{ a[FNR] = (a[FNR] ? a[FNR] FS : "") $9 } END { for(i=1;i<=FNR;i++) pri

我必须捕获目录中所有文件的第9行,并形成一个矩阵。因此,最终的结果矩阵文件应该具有该目录中每个文件的最后一列(第9列)。我试图在下面使用这个awk命令,但似乎每列的行数已经固定。但是每列应该有不同的行长度

我怎样才能做到这一点

所以我为文件创建,每个文件中有不同的行长度

测试1

测试2

测试3

测试4

我使用的命令

awk -v OFS='\t' '{ a[FNR] = (a[FNR] ? a[FNR] FS : "") $9 } END { for(i=1;i<=FNR;i++) print a[i] }' $(ls test*) > test_out.txt

我希望根据每个文件的行长度,输出应该有不同的行。

问题是,
END
块中的
FNR
只是最后一个文件中最后一条记录的记录编号。这就是为什么输出的行数与上一个文件的行数相同。您需要保存所有文件中所有
FNR
s的最大值,并在
END
块的循环中使用该值

比如:

$ awk '{ if (max < FNR) max = FNR; a[FNR] = (FNR in a ? a[FNR] FS : "") $9 } 
       END { for(i=1;i<=max;i++) print a[i] }' test*

96.55273 9.99610 9.99310 9.99310  
96.50636 9.99364 9.99213 9.99213  
92.42281 9.99173 9.99051 9.99051  
92.40503 9.98114 9.98874 9.98874  
91.76054 9.97776 9.97663 9.97663  
91.34667 9.97621 9.96515
90.97657 9.97230 9.95342
90.20087 9.96821 9.95194
90.18221 9.96497 9.94865
9.98589 9.96319 9.94749
9.95046 9.93749
9.94890 9.91189
9.94713 9.90526
9.94077 9.90311
9.93962 9.89441
9.89441
9.89124
9.88999
9.88873
9.88852

你能给我们举几个例子,每个例子有几行,比如说,三个输入文件和你想要的输出吗?@fedorqui,我不认为OP试图解析
ls
——但是用它和
-v
一起列出awk要处理的文件的顺序。@jas很好,你是对的!您能提供一些示例输入和所需输出吗?到目前为止,这段代码看起来不错,但我们不知道:)好的,问题是
END
块中的
FNR
只是最后一个文件中最后一条记录的记录编号。这就是为什么输出的行数与上一个文件的行数相同。您需要保存所有文件中所有
FNR
s的最大值,并将其用于
END
block.Perfect的循环中。谢谢
chr10   79678402    79678978    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_4211 99  .   5.12172 12.22297    9.99310
chr6    91782996    91785061    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_35775    99  .   5.44415 11.81448    9.99213
chr6    87337478    87340150    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_35453    99  .   5.63817 11.98290    9.99051
chr1    53794676    53795323    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_257  99  .   6.10605 12.20900    9.98874
chr11   5986806 5987478 /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_5727 99  .   6.43022 12.47342    9.97663
chr6    121282251   121282898   /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_36549    99  .   5.21404 12.05700    9.96515
chr10   75631023    75636021    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_4005 99  .   5.22504 11.71938    9.95342
chr18   66115872    66117662    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_21569    99  .   5.24544 11.71402    9.95194
chr19   44632939    44635029    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_23305    99  .   4.50809 11.79674    9.94865
chr4    14764961    14765707    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_29038    99  .   5.76862 11.99986    9.94749
chr5    141067881   141068891   /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_33753    99  .   4.88940 11.44856    9.93749
chr10   70650648    70650887    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_3871 99  .   3.28463 11.70058    9.91189
chr6    85478303    85479428    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_35363    99  .   5.67223 11.88624    9.90526
chr5    24227460    24228790    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_31250    99  .   5.34013 11.81155    9.90311
chr6    87217355    87217671    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_35445    98  .   4.94135 11.84741    9.89441
chr19   56822146    56823187    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_23618    98  .   4.19924 11.60634    9.89441
chr5    34353383    34353813    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_31669    98  .   5.41412 11.69552    9.89124
chr8    128343980   128344400   /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_42552    98  .   5.88042 12.31357    9.88999
chr7    120101715   120103357   /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_39838    98  .   5.04756 11.80500    9.88873
chr13   32095516    32096121    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_11938    98  .   5.58792 11.86071    9.88852
chr10   79678402    79678978    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_4211 99  .   5.12172 12.22297    9.99310
chr6    91782996    91785061    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_35775    99  .   5.44415 11.81448    9.99213
chr6    87337478    87340150    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_35453    99  .   5.63817 11.98290    9.99051
chr1    53794676    53795323    /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_257  99  .   6.10605 12.20900    9.98874
chr11   5986806 5987478 /data/GT/polycomb_project/macs2.1_out/PT1_macs2.1_out_peak_5727 99  .   6.43022 12.47342    9.97663
awk -v OFS='\t' '{ a[FNR] = (a[FNR] ? a[FNR] FS : "") $9 } END { for(i=1;i<=FNR;i++) print a[i] }' $(ls test*) > test_out.txt
96.55273 9.99610 9.99310 9.99310
96.50636 9.99364 9.99213 9.99213
92.42281 9.99173 9.99051 9.99051
92.40503 9.98114 9.98874 9.98874
91.76054 9.97776 9.97663 9.97663
$ awk '{ if (max < FNR) max = FNR; a[FNR] = (FNR in a ? a[FNR] FS : "") $9 } 
       END { for(i=1;i<=max;i++) print a[i] }' test*

96.55273 9.99610 9.99310 9.99310  
96.50636 9.99364 9.99213 9.99213  
92.42281 9.99173 9.99051 9.99051  
92.40503 9.98114 9.98874 9.98874  
91.76054 9.97776 9.97663 9.97663  
91.34667 9.97621 9.96515
90.97657 9.97230 9.95342
90.20087 9.96821 9.95194
90.18221 9.96497 9.94865
9.98589 9.96319 9.94749
9.95046 9.93749
9.94890 9.91189
9.94713 9.90526
9.94077 9.90311
9.93962 9.89441
9.89441
9.89124
9.88999
9.88873
9.88852
$ gawk '{ a[FNR] = (FNR in a ? a[FNR] FS : "") $9 } 
        ENDFILE { if (max < FNR) max = FNR } 
        END { for(i=1;i<=max;i++) print a[i] }' test*

96.55273 9.99610 9.99310 9.99310  
96.50636 9.99364 9.99213 9.99213  
92.42281 9.99173 9.99051 9.99051  
92.40503 9.98114 9.98874 9.98874  
91.76054 9.97776 9.97663 9.97663  
91.34667 9.97621 9.96515
90.97657 9.97230 9.95342
90.20087 9.96821 9.95194
90.18221 9.96497 9.94865
9.98589 9.96319 9.94749
9.95046 9.93749
9.94890 9.91189
9.94713 9.90526
9.94077 9.90311
9.93962 9.89441
9.89441
9.89124
9.88999
9.88873
9.88852