awkを使用してcsvの両方の列が数値であることを確認する

awkを使用してcsvの両方の列が数値であることを確認する

以下に示すように、数値または英数字データを含む列Aと列Bを含むCSVがあります。次の場合は、列を作成する必要があります。

  • AまたはBが空です - > Cに「error」を書く
  • AまたはBは数字ではありません。 -> Cに「error」と書く。
  • A&B は数値で、A!=B -> C に「一致しない」を書き込みます。
  • A&Bは数字、A = B -> Cに「一致」と書き込みます。

私のコードは以下にあり、動作しません。助けてください。

awk -F ',' ' NR==1; NR >1 {OFS=",";
if ($1 ~ /^[[:space:]]*$/ || $2 ~ /^[[:space:]]*$/)
   print $1,$2,"Error";
else if ($1 ~ /^[[:alpha:]]+$/ || $2 ~ /^[[:alpha:]]+$/)
   print $1,$2,"Error";
else if ($1 == /^([[:digit:]]+)$/ && $2 == /^([[:digit:]]+)$/ && $1 != $2)
    print $1,$2,"Mismatch";
else if ($1 == /^([[:digit:]]+)$/ && $2 == /^([[:digit:]]+)$/ && $1 == $2)
    print $1,$2,"Match";
  } ' ~/input.csv > ~/output.csv

入力データの例:

232,2w323   
343,   
   ,454  
565,677  
fg66,   
   ,ghg6  
gf6,ghugyu6 

答え1

入力でスペースを変更したら、次のものを使用できます。

awk '
BEGIN { OFS=FS=","}
NR==1 { print; next }
$1 ~ /^[[:digit:]]+$/ && $2 ~ /^[[:digit:]]+$/ {
    print $1,$2,($1==$2)?"Match":"Mismatch"
    next
}
{ print $1,$2,"Error" }
' input.csv > output.csv

出力:

232,2w323,Error
343,   ,Error
   ,454,Error
565,677,Mismatch
fg66,  ,Error
   ,ghg6,Error
gf6,ghugyu6,Error

関連情報