単一のファイルから互いにデータセットを取り除こうとします。ただし、スクリプトが出力値に達すると、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
上記は、いくつかの形式を単純化するために出力フィールド区切り文字としても使用されます。