カテゴリー
【Awk & Jq活用講座】検索対象が無いときの対処方法〜エラー時の値を#N/Aに置き換える
※ 当ページには【広告/PR】を含む場合があります。
2021/04/07
はじめに
Excelの値入力エラー時の挙動を定義する
$ awk -F"," '{print $1*$2;}' << EOF
3,6
4,19
8,3
5,22
EOF
#👇出力
0
76
24
0
#N/A
Awkの場合
$ awk -F"," '{
if ($1 ~ /[^0-9.]/ || $2 ~ /[^0-9.]/) {
print "#N/A";
} else {
print $1*$2;
}
}' << EOF
3,6
4,19
8,3
5,22
4.5,9.13
526,0.0
9.1,0.0
EOF
#👇出力
#N/A
76
24
#N/A
41.085
0
#N/A
typeof
$ awk -F"," '{
if ( typeof($1) != "strnum" || typeof($2) != "strnum" ) {
print "#N/A";
} else {
print $1*$2;
}
}' << EOF
3,6
4,19
8,3
5,22
4.5,9.13
526,0.0
9.1,0.0
EOF
#👇出力
#N/A
76
24
#N/A
41.085
0
#N/A
array
number
regexp
string
strnum
undefined
よもやま講座 〜 条件分岐のショートハンド
if~else if~else
条件 ? 真の場合の返値 : 偽の場合の返値
$ awk -F"," '{
print ($1 ~ /[^0-9.]/ || $2 ~ /[^0-9.]/) ? "#N/A" : $1*$2;
}' << EOF
3,6
4,19
8,3
5,22
4.5,9.13
526,0.0
9.1,0.0
EOF
#👇出力
#N/A
76
24
#N/A
41.085
0
#N/A
||
&&
$ echo '1,2,3' | awk -F"," '
function func1(arg1_) {
print arg1_;
return 0;
}
function func2(arg2_) {
print arg2_;
return 0;
}
function func3(arg3_) {
print arg3_;
return 1;
}
function func4(arg4_) {
print arg4_;
return 1;
}
{
func1($1) || func2($2) || func3($3) && func4($0);
}'
#👇出力
1
2
3
1,2,3
$ awk -F"," '
function isStrnum(str_) {
if (str_ ~ /[^0-9.]/) {
print "#N/A";
return 1;
}
return 0;
}
function calc(arg1_, arg2_) {print arg1_ * arg2_}
{
isStrnum($1) || isStrnum($2) || calc($1, $2);
}' << EOF
3,6
4,19
8,3
5,22
4.5,9.13
526,0.0
9.1,0.0
EOF
#👇出力
#N/A
76
24
#N/A
41.085
0
#N/A
Jqの場合
text("パターン")
tonumber
if ~ then ~ else ~ end
$ jq -s -R '
[
split("\n")[] | select(length > 0) |
[
split(",") | .[] |
if test("[^0-9.]") then "#N/A" else tonumber end
]
]
' << EOF
4,19
3,6
EOF
#👇出力
[
[
4,
19
],
[
3,
"#N/A"
]
]
#N/A
$ jq -s -R '
[split("\n")[] | select(length > 0) | [ split(",") | .[] | if test("[^0-9.]") then "#N/A" else tonumber end ]] |
[
.[] | if .[0] == "#N/A" or .[1] == "#N/A" then "#N/A" else .[0] * .[1] end
]
' << EOF
3,6
4,19
8,3
5,22
4.5,9.13
526,0.0
9.1,0.0
EOF
#👇出力
[
"#N/A",
76,
24,
"#N/A",
41.085,
0,
"#N/A"
]
#N/A
$ jq -s -R '
[split("\n")[] | select(length > 0) | split(",")] |
[
.[] | if (.[0] | test("[^0-9.]")) or (.[1] | test("[^0-9.]")) then "#N/A" else (.[0] | tonumber) * (.[1] | tonumber) end
]
' << EOF
3,6
4,19
8,3
5,22
4.5,9.13
526,0.0
9.1,0.0
EOF
#👇出力
[
"#N/A",
76,
24,
"#N/A",
41.085,
0,
"#N/A"
]
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー