簡體   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