awk 根据行长度切换输出字段分隔符

问题描述 投票:0回答:1

所以我给自己写了一个 awk 小脚本。其目的是在遍历该行时找到第四列的总和,然后在各行对总和的贡献百分比旁边打印记录。

代码如下所示

#!/bin/awk -f
#

{
        lines[NR]=$0;
        Distances[NR]=$NF;
        Max_Distance+=$NF;
        MAX_LINES=NR
        #print length($0)

}

END{
        for(i=3; i<=MAX_LINES; i++)
        {
                increment = Distances[i]/Max_Distance*100;
                print length(lines[i]), lines[i], increment;

        }
}

现在,我将此脚本应用于附加文件,这些文件的行始终具有相同数量的字段,但有时字符数量不同。

 476         23      281             268        0.0421744
 475         24      469             448        0.0426674
 474         25      147             141        0.0434187
 473         26       70              69        0.0445487
 472         27       68              61        0.0482006
 471         28       19              15        0.0504292
 470         29      315             303        0.0508844
 469         30      121              -4        0.0509563
 468         31      424             407        0.0511194
 467         32      189             180        0.0520713
 466         33       18              14        0.0531791
 465         34      117             107        0.0532455
 464         35       46              43        0.0538684
 463         36      179             173        0.0547426
 462         37      136             109        0.0550616
 461         38       42              38        0.058816
 460         39       13              10        0.0640171
 459         40      265             250        0.0648825
 458         41      120             111        0.064891
 457         42      118              99        0.0663346
 456         43      464             466        0.0671883
 455         44       31              28        0.0681487
 454         45      213             201        0.0700088
 453         46      -26             129        0.0711404
 452         47      185             160        0.0731869
 451         48       83              71        0.0735005
 450         49      104              -1        0.0736425
 449         50      346             330        0.0741638
 448         51      311             -20        0.0759164
 447         52      400             398        0.0767254
 446         53      374             358        0.0770171
 445         54      475             465        0.0774754
 444         55       90             -12        0.0809141
 443         56      -10             -14        0.0831925

输出有点出乎意料:

56      474         25      147             141        0.0434187        2.05997
56      473         26       70              69        0.0445487        2.11359
56      472         27       68              61        0.0482006        2.28685
56      471         28       19              15        0.0504292        2.39258
56      470         29      315             303        0.0508844        2.41418
56      469         30      121              -4        0.0509563        2.41759
56      468         31      424             407        0.0511194        2.42533
56      467         32      189             180        0.0520713        2.47049
56      466         33       18              14        0.0531791        2.52305
56      465         34      117             107        0.0532455        2.5262
56      464         35       46              43        0.0538684        2.55575
56      463         36      179             173        0.0547426        2.59723
56      462         37      136             109        0.0550616        2.61237
55      461         38       42              38        0.058816 2.79049
56      460         39       13              10        0.0640171        3.03725
56      459         40      265             250        0.0648825        3.07831
55      458         41      120             111        0.064891 3.07872
56      457         42      118              99        0.0663346        3.14721
56      456         43      464             466        0.0671883        3.18771
56      455         44       31              28        0.0681487        3.23328
56      454         45      213             201        0.0700088        3.32153
56      453         46      -26             129        0.0711404        3.37521
56      452         47      185             160        0.0731869        3.47231
56      451         48       83              71        0.0735005        3.48719
56      450         49      104              -1        0.0736425        3.49393
56      449         50      346             330        0.0741638        3.51866
56      448         51      311             -20        0.0759164        3.60181
56      447         52      400             398        0.0767254        3.64019
56      446         53      374             358        0.0770171        3.65403
56      445         54      475             465        0.0774754        3.67578
56      444         55       90             -12        0.0809141        3.83892
56      443         56      -10             -14        0.0831925        3.94702

我说意外是因为在其中两行中,最后一个字段与其余行仅通过空格分隔,而在所有其他情况下,它由制表符分隔。我现在的问题是为什么会这样以及我该如何解决它?

提前致谢!

我希望所有字段间隔相等,并且在最后一列和行的其余部分之间始终有一个制表符。我已经尝试过使用不同类型的打印语句

备注:我想我有一个解决方法,但我现在真的很想知道为什么它会这样。

awk
1个回答
0
投票

一种可能的方法是使用格式化的

print
命令。您可以通过替换行来尝试:

print length(lines[i]), lines[i], increment;

printf "%s %-60s %-20s\n", length(lines[i]), lines[i], increment;

随意填写以调整字段长度

© www.soinside.com 2019 - 2024. All rights reserved.