Linux中國

如何發現截斷的數據項

截斷(形容詞):縮寫、刪節、縮減、剪切、剪裁、裁剪、修剪……

數據項被截斷的一種情況是將其輸入到資料庫欄位中,該欄位的字元限制比數據項的長度要短。例如,字元串:

Yarrow Ravine Rattlesnake Habitat Area, 2 mi ENE of Yermo CA

是 60 個字元長。如果你將其輸入到具有 50 個字元限制的「位置」欄位,則可以獲得:

Yarrow Ravine Rattlesnake Habitat Area, 2 mi ENE #末尾帶有一個空格

截斷也可能導致數據錯誤,比如你打算輸入:

Sally Ann Hunter (aka Sally Cleveland)

但是你忘記了閉合的括弧:

Sally Ann Hunter (aka Sally Cleveland

這會讓使用數據的用戶覺得 Sally 是否有被修剪掉了數據項的其它的別名。

截斷的數據項很難檢測。在審核數據時,我使用三種不同的方法來查找可能的截斷,但我仍然可能會錯過一些。

數據項的長度分布。第一種方法是捕獲我在各個欄位中找到的大多數截斷的數據。我將欄位傳遞給 awk 命令,該命令按欄位寬度計算數據項,然後我使用 sort 以寬度的逆序列印計數。例如,要檢查以 tab 分隔的文件 midges 中的第 33 個欄位:

awk -F"t" 'NR>1 {a[length($33)]++} 
    END {for (i in a) print i FS a[i]}' midges | sort -nr

distro1

最長的條目恰好有 50 個字元,這是可疑的,並且在該寬度處存在數據項的「凸起」,這更加可疑。檢查這些 50 個字元的項目會發現截斷:

distro2

我用這種方式檢查的其他數據表有 100、200 和 255 個字元的「凸起」。在每種情況下,這種「凸起」都包含明顯的截斷。

未匹配的括弧。第二種方法查找類似 ...(Sally Cleveland 的數據項。一個很好的起點是數據表中所有標點符號的統計。這裡我檢查文件 mag2

grep -o "[[:punct:]]" file | sort | uniqc

punct

請注意,mag2 中的開括弧和閉括弧的數量不相等。要查看發生了什麼,我使用 unmatched 函數,它接受三個參數並檢查數據表中的所有欄位。第一個參數是文件名,第二個和第三個是開括弧和閉括弧,用引號括起來。

unmatched()
{
    awk -F"t" -v start="$2" -v end="$3" 
        &apos;{for (i=1;i<=NF;i++) 
            if (split($i,a,start) != split($i,b,end)) 
                print "line "NR", field "i":n"$i}&apos; "$1"
}

如果在欄位中找到開括弧和閉括弧之間不匹配,則 unmatched 會報告行號和欄位號。這依賴於 awksplit 函數,它返回由分隔符分隔的元素數(包括空格)。這個數字總是比分隔符的數量多一個:

split

這裡 ummatched 檢查 mag2 中的圓括弧並找到一些可能的截斷:

unmatched

我使用 unmatched 來找到不匹配的圓括弧 ()、方括弧 []、花括弧 {} 和尖括弧 <>,但該函數可用於任何配對的標點字元。

意外的結尾。第三種方法查找以尾隨空格或非終止標點符號結尾的數據項,如逗號或連字元。這可以在單個欄位上用 cut 用管道輸入到 grep 完成,或者用 awk 一步完成。在這裡,我正在檢查以製表符分隔的表 herp5 的欄位 47,並提取可疑數據項及其行號:

cut -f47 herp5 | grep -n "[ ,;:-]$"
或
awk -F"t" &apos;$47 ~ /[ ,;:-]$/ {print NR": "$47}&apos; herp5

herps5

用於製表符分隔文件的 awk 命令的全欄位版本是:

awk -F"t" &apos;{for (i=1;i<=NF;i++) if ($i ~ /[ ,;:-]$/) 
    print "line "NR", field "i":n"$i}&apos; file

謹慎的想法。在我對欄位進行的驗證測試期間也會出現截斷。例如,我可能會在「年」的欄位中檢查合理的 4 位數條目,並且有個 198 可能是 198n?還是 1898 年?帶有丟失字元的截斷數據項是個謎。 作為數據審計員,我只能報告(可能的)字元損失,並建議數據編製者或管理者恢復(可能)丟失的字元。

via: https://www.polydesmida.info/BASHing/2018-07-04.html

作者:polydesmida 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國