Shell-Script

使用 awk 檢查 csv 中的兩列是否完全是數字

  • October 17, 2019

我有一個 csv,其中 A 列和 B 列如下,其中包含數字或字母數字數據。我需要編寫列 C,如果,

  • A 或 B 為空白 -> 在 C 中寫入“錯誤”
  • A 或 B 不是數字 -> 在 C 中寫入“錯誤”
  • 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 

修復輸入中的空格後,您可以使用:

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

引用自:https://unix.stackexchange.com/questions/547220