繁体   English   中英

用awk打印漂亮?

[英]Pretty-print with awk?

我有一个代码,用于将存储在文件(在一列中)中的数字输出到另一个TXT文件。 执行此操作的代码部分是:

awk -F"\n" 'NR==1{a=$1"    ";next}{a=a$1"    "}END{print a}' col_trim.txt >> row.txt

输出是这样的:

1.31    2.3    3.35    2.59    1.63
2.03    2.21    1.99    1.5    1.12 
1    0.6    -0.71    -2.1    0.01 

但我希望它是这样的:

1.31    2.30    3.35    2.59    1.63
2.03    2.21    1.99    1.50    1.12 
1.00    0.60   -0.71   -2.10    0.01 

如您所见,第二个样本中的所有数字在小数点后还有两位数字,并且如果它们都为负数,则在数字之前放置负号,这样就不会弄乱数字的排列方式。

任何想法?

PS:输入文件是一个文本文件,带有一列数字(每行):

1.31
2.3
3.35
2.59
1.63

整个代码是这样的:

#!/bin/sh

rm *.txt
for time in 00 03 06 09 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96; do
    filename=gfs.t00z.master.grbf$time.10m.uv.grib2
    wgrib2 $filename -spread $time.txt
    sed 's:lon,lat,[A-Z]* 10 m above ground d=\([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\).*:\1 '$time'0000:' $time.txt > temp.txt
    for (( j = 1; j <= 2; j++ )); do
        if [ j == 1 ]; then
            sed -n '/lon,lat,UGRD/,/lon,lat,VGRD/p' $time.txt > vel_sep.txt
        else
            sed -n '/lon,lat,VGRD/,/359.500000,90.000000/p' $time.txt > vel_sep.txt
        fi
        line=174305
        sed -n 1p temp.txt >> row.txt
        for (( i = 1; i <= 48;  i++ )); do
            sed -n "$line","$(($line+93))"p vel_sep.txt > col.txt
            sed 's:[0-9]*.[0-9]*,[0-9]*.[0-9]*,::' col.txt > col_trim.txt   
            awk -F"\n" 'NR==1{a=$1"    ";next}{a=a$1"    "}END{print a}' col_trim.txt >> row.txt
            line=$(($line-720))
        done
    done
done

exit 0

您可以使用column命令:

awk -F"\n" 'NR==1{a=$1"    ";next}{a=a$1"    "}END{print a}' col_trim.txt | \
    column -t >> row.txt

这给出:

1.31  2.3   3.35   2.59  1.63
2.03  2.21  1.99   1.5   1.12
1     0.6   -0.71  -2.1  0.01

用以下内容替换您的awk:

awk -F"\n" 'NR==1{a=sprintf("%10.2f", $1); next}
           {a=sprintf("%s%10.2f", a,$1);}END{print a}' col_trim.txt >> row.txt

编辑:对于左对齐:

awk -F"\n" 'NR==1{a=sprintf("%-8.2f", $1); next}
           {a=sprintf("%s%-8.2f", a,$1);}END{print a}' col_trim.txt >> row.txt

可以使用带有awk printf来解决

样品:

echo -e "1 -2.5 10\n-3.4 2   12" | awk '{printf "%8.2f %8.2f %8.2f\n",$1,$2,$3}'
    1.00    -2.50    10.00
   -3.40     2.00    12.00

此外,此脚本还有很大的空间可以改进。

这是第一个:

从:

for time in 00 03 06 09 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96; do

for time in $(seq 0 3 96); do
    time=$(printf "%02d" $time)

如果您可以向我们展示wgrib2 $filename -spread $time.txt的示例输出,我们可以给出更多建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM