printf awk を使用して XYZ 列を書式設定すると、最初の文字が最後の文字に移動されます。

printf awk を使用して XYZ 列を書式設定すると、最初の文字が最後の文字に移動されます。

7つの列を持つファイルがありますが、最初の4つの列を取得してawkを使用してフォーマットしたいと思います。書式なしでawkを使用すると機能しますが、printfと一緒に使用すると、最初の行の最初の文字が最後の行に移動します。

私が使う時の例sed -n "323,384p" file.xyz | awk '{print $1, $2, $3, $4}'

H 1.159798 1.491313 -0.946869
O 0.854926 2.591706 0.311355
O 1.225042 0.465961 2.017823
O 3.035434 -1.589327 2.087115
H 2.323008 -0.909968 6.144897
H 0.166459 -2.029119 3.043016
H 1.551022 -2.693028 4.563796
H 0.353505 -2.316287 5.790394

しかし、私が使うときsed -n "323,384p" file.xyz | awk '{printf "%15s %15s %15s \n" $1, $2, $3, $4}'

       1.159798        1.491313       -0.946869  
H       0.854926        2.591706        0.311355  
O       1.225042        0.465961        2.017823  
O       3.035434       -1.589327        2.087115  
O       0.588302       -2.894040        1.612656  
O       2.323008       -0.909968        6.144897  
H       0.166459       -2.029119        3.043016  
H       1.551022       -2.693028        4.563796  
H       0.353505       -2.316287        5.790394  
H

何らかの理由で最初に表示する必要がある文字Hは、最後の行の後に表示されます。この問題を解決する方法を知っている人はいますか?

単純化のために、xyzファイルにすべての行を置いたわけではありません。

ベストアンサー1

ステートメントには3つのプレースホルダーがありますprintf$1前にカンマがないため、改行文字の後のフォーマット文字列に追加されます$1。フィールド$2合計$3$4形式はですprintf。結果は$1常に改行文字の後に印刷されます。

次の形式を使用して、4つのフィールドすべての形式を指定できますprintf

... | awk '{printf "%s %15s %15s %15s\n", $1, $2, $3, $4}'

おすすめ記事