以列格式输出格式

Ano*_*ist 9 bash awk grep sed

我想知道如何格式化以下输出:

-0.3116274D-04
-0.2389361D-04
-0.1192458D-04
0.3306203D-04
0.2534987D-04
0.1265136D-04
-0.2167920D-04
-0.3713258D-04
-0.2294900D-05
-0.4151710D-05
-0.7674479D-03
-0.5749288D-04
0.1393479D-04
0.6763913D-04
0.2515100D-05
-0.3638000D-06
-0.2630000D-06
-0.2445230D-06
0.1534680D-05
0.1579750D-04
0.2922010D-04
0.5390530D-04
0.8701990D-04
0.1132741D-03
0.9665700D-04
0.3337340D-04
-0.4121240D-05
Run Code Online (Sandbox Code Playgroud)

通过首先转置为五列:

-0.3116274D-04  -0.2389361D-04  -0.1192458D-04   0.3306203D-04   0.2534987D-04
 0.1265136D-04  -0.2167920D-04  -0.3713258D-04  -0.2294900D-05  -0.4151710D-05
-0.7674479D-03  -0.5749288D-04   0.1393479D-04   0.6763913D-04   0.2515100D-05
-0.3638000D-06  -0.2630000D-06  -0.2445230D-06   0.1534680D-05   0.1579750D-04
 0.2922010D-04   0.5390530D-04   0.8701990D-04   0.1132741D-03   0.9665700D-04
 0.3337340D-04  -0.4121240D-05          
Run Code Online (Sandbox Code Playgroud)

我的第一个方法是:

sed 's/\n//g' File | column -n
Run Code Online (Sandbox Code Playgroud)

小智 27

试试这个:

printf "%14s  %14s  %14s  %14s  %14s\n" $(cat data.txt)
Run Code Online (Sandbox Code Playgroud)

  • 你赢了 :-).根据[printf](http://man.cx/printf)联机帮助页:_格式字符串会根据需要经常重用以满足参数._ (2认同)

Jon*_*ler 6

答案通过traybold使用printf "%14s %14s %14s %14s %14s\n" $(cat data.txt)和可能应该被使用,但要注意的是,最后一行是空白填充到全宽.此外,如果数据文件非常大(可能是256 KiB;几乎可以肯定在达到1 MiB之前),那么命令行参数的空间将用尽printf.下面的解决方案将适用于大小为兆字节的文件,而不会对系统产生负面影响.

您几乎可以pr在多列模式(pr -5 -l1 -t)中使用,但它左对齐列,因此-符号将无法正确显示.OTOH,然后您可以将输出提供给awk以进行右对齐:

pr -5 -l1 -t File | awk '{ printf "%14s %14s %14s %14s %14s\n", $1, $2, $3, $4, $5 }'
Run Code Online (Sandbox Code Playgroud)

但是如果你要拖入awk游戏,那么它也可以为你做"换位" - 但这需要更多的编码来做到这一点.

你的建议几乎可行,但当我尝试它时,我得到:0.8725220D- 0.1609633D- 0.2598447D-; 每个数字的指数都消失了.

一些奇迹pr.默认情况下,它使用选项卡分隔列.您可以使用-s' '或通过指定输出宽度更宽来覆盖它(例如-w100).请注意,参数值(如空间)需要附加到选项,至少在传统实现中是这样pr(但-w 100可以正常工作).

$ pr -s' ' -5 -l1 -t data | awk '{printf "%14s  %14s  %14s  %14s  %14s\n", $1, $2, $3, $4, $5}'
-0.3116274D-04  -0.2389361D-04  -0.1192458D-04   0.3306203D-04   0.2534987D-04
 0.1265136D-04  -0.2167920D-04  -0.3713258D-04  -0.2294900D-05  -0.4151710D-05
-0.7674479D-03  -0.5749288D-04   0.1393479D-04   0.6763913D-04   0.2515100D-05
-0.3638000D-06  -0.2630000D-06  -0.2445230D-06   0.1534680D-05   0.1579750D-04
 0.2922010D-04   0.5390530D-04   0.8701990D-04   0.1132741D-03   0.9665700D-04
 0.3337340D-04  -0.4121240D-05                                                
$ pr -w 100 -5 -l1 -t data | awk '{printf "%14s  %14s  %14s  %14s  %14s\n", $1, $2, $3, $4, $5}'
-0.3116274D-04  -0.2389361D-04  -0.1192458D-04   0.3306203D-04   0.2534987D-04
 0.1265136D-04  -0.2167920D-04  -0.3713258D-04  -0.2294900D-05  -0.4151710D-05
-0.7674479D-03  -0.5749288D-04   0.1393479D-04   0.6763913D-04   0.2515100D-05
-0.3638000D-06  -0.2630000D-06  -0.2445230D-06   0.1534680D-05   0.1579750D-04
 0.2922010D-04   0.5390530D-04   0.8701990D-04   0.1132741D-03   0.9665700D-04
 0.3337340D-04  -0.4121240D-05  
$
Run Code Online (Sandbox Code Playgroud)

所有这些pr | awk解决方案将最后一行填空到全宽.

以下是两个awk在一个命令中完成工作的等效脚本.一个将代码分为两行,另一行分为16行(但更容易阅读):

选项1:

awk '{ a[i++] = $0; if (i == 5) { printf "%14s  %14s  %14s  %14s  %14s\n", a[0], a[1], a[2], a[3], a[4]; i = 0; } }
     END { if (i > 0) { printf "%14s", a[0]; for (j = 1; j < i; j++) printf "  %14s", a[j]; printf "\n"; } }' data
Run Code Online (Sandbox Code Playgroud)

选项2:

awk '{  a[i++] = $0
        if (i == 5)
        {
            printf "%14s  %14s  %14s  %14s  %14s\n", a[0], a[1], a[2], a[3], a[4]
            i = 0
        }
     }
     END {
        if (i > 0)
        {
            printf "%14s", a[0]
            for (j = 1; j < i; j++)
                printf "  %14s", a[j]
            printf "\n"
        }
     }' data
Run Code Online (Sandbox Code Playgroud)

输出与之前相同,只是这些空白垫都不是最后一行:

-0.3116274D-04  -0.2389361D-04  -0.1192458D-04   0.3306203D-04   0.2534987D-04
 0.1265136D-04  -0.2167920D-04  -0.3713258D-04  -0.2294900D-05  -0.4151710D-05
-0.7674479D-03  -0.5749288D-04   0.1393479D-04   0.6763913D-04   0.2515100D-05
-0.3638000D-06  -0.2630000D-06  -0.2445230D-06   0.1534680D-05   0.1579750D-04
 0.2922010D-04   0.5390530D-04   0.8701990D-04   0.1132741D-03   0.9665700D-04
 0.3337340D-04  -0.4121240D-05
Run Code Online (Sandbox Code Playgroud)

编写代码会更容易也更短; 重置代码也delete a可以清除数组,END块只是测试i和使用printf主代码:

awk '{  a[i++] = $0
        if (i == 5)
        {
            printf "%14s  %14s  %14s  %14s  %14s\n", a[0], a[1], a[2], a[3], a[4]
            i = 0
            delete a
        }
     }
     END {
        if (i > 0) printf "%14s  %14s  %14s  %14s  %14s\n", a[0], a[1], a[2], a[3], a[4]
     }' data
Run Code Online (Sandbox Code Playgroud)