用awk打印漂亮的打印件?

时间:2014-02-04 06:50:57

标签: bash awk pretty-print

我有一个代码,用于将存储在文件中的数字(在一列中)输出到另一个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 

如您所见,第二个样本中的所有数字在小数点后都有2位数,如果它们是负数,则负号位于数字之前,因此不会弄乱数字的排列。

有什么想法吗?

P.S .: 输入文件是一个文本文件,其中包含一列数字(对于每一行):

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

4 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:2)

用这个替换你的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

答案 2 :(得分:1)

这可以使用printfawk

来解决

Eksample:

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

答案 3 :(得分:1)

此外,这个脚本有很大的空间我们可以改进。

这是第一个:

从:改变:

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的示例输出,我们可以提供更多建议。