awk - フィールドに数値の代わりに文字列が含まれている場合に別の形式を使用する算術演算

awk - フィールドに数値の代わりに文字列が含まれている場合に別の形式を使用する算術演算

単一のファイルから互いにデータセットを取り除こうとします。ただし、スクリプトが出力値に達すると、na出力は正しくありません。

入力ファイル:

# <header>

2002    328     0.1345  2002    328     na
2002    329     na      2002    329     0.281065021
2002    330     0.9     2002    330     0.1

現在使用しているawkスクリプトは次のとおりです。

NR==1{print $0, " diff.\n"}
NR>2{printf("%s\t%7.6f\n", $0, $3-$6)}

出力:

# <header> diff.

2002    328     0.1345  2002    328     na      0.134500
2002    329     na      2002    329     0.281065021     -0.281065
2002    330     0.9     2002    330     0.1     0.800000

naこの場合、分析を容易にするために、測定値の代わりに「」が表示される出力列を探しています。

希望の出力:

# <header> diff.

2002    328     0.1345  2002    328     na      na
2002    329     na      2002    329     0.281065021     na
2002    330     0.9     2002    330     0.1     0.800000

答え1

NR>2たとえば、次のように文を条件付きで作成します。

BEGIN {OFS="\t"}
NR==1 {print $0, "diff.\n"}
NR>2 {print $0, ( $3=="na" || $6=="na" ? "na" : sprintf("%7.6f", $3-$6) )}
  • $3=="na" || $6=="na"これは条件として使用されます。if either field three or six are "na", print "na", else print the subtraction
  • フィールド 3 または 6 が数字ではなく " na" でない場合は、より複雑なアプローチを試すことができます。$3 !~ /^[0-9]+(\.[0-9]+)?$/ || $6 !~ /^[0-9]+(\.[0-9]+)?$/
  • \t上記は、いくつかの形式を単純化するために出力フィールド区切り文字としても使用されます。

関連情報