Unix 命令列中的即席資料分析/使用 gnuplot 進行快速繪圖
早起的鳥兒有蟲吃?讓我們看看一個人上班時間和收入之間的關係。收入記錄在第 297-303 列,上班時間記錄在第 196-198 列,以十分鐘為間隔編碼。此管道提取、清理和格式化資料
$ cat pums_53.dat | grep "^P" | cut -c196-198,297-303 | grep -v "^000" | grep -v " $" | perl -pe 'substr($_,3,0)=" ";' > time_vs_income
grep 命令排除了任何欄位為空的記錄,perl 指令碼在兩列之間插入一個空格,以便 gnuplot 可以將列分開。在 gnuplot 中繪圖很簡單
$ gnuplot
G N U P L O T
Linux version 3.7 patchlevel 1
last modified Fri Oct 22 18:00:00 BST 1999
Terminal type set to 'x11'
gnuplot> plot 'time_vs_income' with points
以及生成的繪圖
請記住,x 軸上的 0 代表午夜,20 代表午夜後 200 分鐘,即大約凌晨 3:20。傳統的第一個和第二個班次開始時密度增加很明顯。工作時間規律的人顯然收入更高。計算每個時間段的平均收入會很有趣,但這會讓命令列 perl 指令碼變得非常複雜。以下是它所有恐怖的輝煌
$ cat pums_53.dat | grep "^P" | cut -c196-198,297-303 | grep -v "^000" |
grep -v " $" | perl -ne '/(\d{3})(\d{7})/; $sum{$1}+=$2; $count{$1}++; END { foreach $k
(keys(%count)) {print $k," ",$sum{$k}/$count{$k},"\n"}}' | sort -n > time_vs_avgincome
如果您好奇,可以自己繪製結果。
讓我們看看華盛頓州歷史上移民的比例。移民年份記錄在第 78-81 列,0000 代表該人是土生土長的公民。我們可以對 cut、grep、sort 和 uniq 應用常用的技巧,但在文字輸出中來回滾動時很難看到模式,如果我們可以看到一個圖表會更好。
$ cat pums_53.dat | grep "^P" | cut -c78-81 | grep -v 0000 | sort | uniq -c | head -10 2 1910 7 1914 12 1919 7 1920 6 1921 5 1922 7 1923 5 1924 8 1925
Gnuplot 是一個非常好的繪圖工具,但它希望類別標籤放在前面,計數放在後面,因此我們需要編寫一個 perl 指令碼來反轉 uniq 的輸出並將結果貼上到一個檔案中。有關 perl 的 -a 和 -F 選項的詳細資訊,請參閱 perlrun(1)。
$ cat pums_53.dat | grep "^P" | cut -c78-81 | grep -v 0000 | sort | uniq -c | perl -lape 'chomp $F[-1]; $_ = join " ", reverse @F' > year_of_immigration
現在我們可以使用 gnuplot 從檔案內容中製作條形圖。
gnuplot> plot 'year_of_immigration' with impulses
這是 gnuplot 生成的圖形
在解釋這個圖表時要小心,只有還活著的人才能被計算,因此它自然會向上和向右移動(最近移民的人更有可能還活著)。也就是說,二戰結束之後似乎移民人數有所增加,越南戰爭結束之後也出現了一個高峰。我仍然不明白 1980 年左右的峰值,請諮詢你當地的歷史學家。
set term win; set grid;A1=-300;A2=250;n=360;z=2500;splot(x**2)/(A1**2) + (y**2)/(A2**2) - ((2*x*y)/(A1*A2))*cos(n-z) - (sin(n-z))**2

