2015-11-05 61 views
0

我在R中編寫了一個函數,它將根據用戶通過用戶界面選擇的條件生成awk腳本,以從csv中提取行。帶數字和字符串的awk查詢

這是由函數生成的字符串的例子:

$ tail -n +2 ../data/faults_main_only_dp_1_shopFlag.csv | 
>  parallel -k -q --block 500M --pipe \ 
>   awk -F , '$5 > "2013-01-01" && $5 < "2015-11-05" && ($3 == "20116688") && ($20 == "Disregard") {print $1 "," $3 "," $17 "," $20 }' | 
> head | csvlook 

因爲$3是一個數值變量,它不返回任何東西。兩者都沒有:

$ tail -n +2 ../data/faults_main_only_dp_1_shopFlag.csv | 
>  parallel -k -q --block 500M --pipe \ 
>   awk -F , '$5 > "2013-01-01" && $5 < "2015-11-05" && ($3 == 20116688) && ($20 == Disregard) {print $1 "," $3 "," $17 "," $20 }' | 
> head | csvlook 

...因爲$20是一個字符串。

這將返回數據集的一部分:

$ tail -n +2 ../data/faults_main_only_dp_1_shopFlag.csv | 
>  parallel -k -q --block 500M --pipe \ 
>   awk -F , '$5 > "2013-01-01" && $5 < "2015-11-05" && ($3 == 20116688) && ($20 == "Disregard") {print $1 "," $3 "," $17 "," $20 }' | 
> head | csvlook` 

|---------+------------+------+------------| 
| 5058.0 | 20116688.0 | 4162 | Disregard | 
|---------+------------+------+------------| 
| 5060.0 | 20116688.0 | 3622 | Disregard | 
| 5060.0 | 20116688.0 | 3619 | Disregard | 
| 5061.0 | 20116688.0 | 766 | Disregard | 
| 5059.0 | 20116688.0 | 3603 | Disregard | 
| 5055.0 | 20116688.0 | 1013 | Disregard | 
| 5058.0 | 20116688.0 | 1012 | Disregard | 
| 5055.0 | 20116688.0 | 4163 | Disregard | 
| 5060.0 | 20116688.0 | 4225 | Disregard | 
| 5061.0 | 20116688.0 | 3466 | Disregard | 
|---------+------------+------+——————| 

不幸的是,我目前沒有預期的一種方式,其變量的用戶選擇通過用戶界面將是字符串或數字(我知道如何做到這一點,但如果有解決方法,我寧願花費時間也需要時間)。有沒有辦法在比較之前爲每個變量賦一個字符串,或者有其他方法來處理這個問題?

編輯這是原始數據的樣子:

$ csvcut -c15:20 faults_main_only_dp_1_shopFlag.csv | head 
faultActiveLongitude,faultActiveAltitude,faultCode,faultSoftwareVersion,stateID,stateName 
-0.8100106,-1.0,3604,25.07.01 11367,2.0,Work Item 
-0.81860137,840.0,766,25.07.01 11367,5.0,Disregard 
-0.8100140690000001,-1.0,4279,25.07.01 11367,2.0,Work Item 
-0.8100509640000001,-2.0,4279,25.07.01 11367,2.0,Work Item 
-0.8102342,14.0,3604,25.07.01 11367,2.0,Work Item 
-0.8181563620000001,831.0,3604,25.07.01 11367,5.0,Disregard 
-0.81022054,11.0,3604,25.07.01 11367,2.0,Work Item 
-0.8102272,11.0,4279,25.07.01 11367,2.0,Work Item 
-0.8083836999999999,17.0,766,25.07.01 11367,5.0,Disregard 
+0

我無法重現該問題。 awk中的所有東西都是一個字符串,所以你的第一次嘗試應該是有效的,除非數據實際上有數字上的「.0」。在這種情況下,你應該說'$ 3 ==「20116688.0」'。 –

+0

數據沒有.0,但是當我將該列導入到R中時,它不是一個整數,而是一個數字。 –

+0

您在awk中輸入的實際數據是什麼樣的,在csvlook之外? –

回答

0

AWK能做的INT <-->字符串比較,如果令牌可以轉換。請注意,您使用逗號作爲字段分隔符,空格將成爲字段的一部分。如果它不是一個小數點問題,即你的號碼是整數,

檢查這三種情況

$ echo "42,42" | awk -F, '$1=="42" && $2==42{print "works";next} {print "does not work"}' 
works 

$ echo "42, 42" | awk -F, '$1=="42" && $2==42{print "works";next} {print "does not work"}' 
works 

$ echo "42 , 42" | awk -F, '$1=="42" && $2==42{print "works";next} {print "does not work"}' 
does not work 

字符串解釋(第一場)應當沒有空間!

你可以試試你的域分隔設置到" *, *"

UPDATE:如果你的整數得到.0浮點擴展,它可以忽略,將它們轉換爲int比較之前

$ echo "42.0 , 42" | awk -v FS=" *, *" 'int($1)=="42" && $2=="42"{print "works";next} {print "does not work"}' 
works 

這裏您泛型值將被引用,但字段將在字符串轉換之前轉換爲int。你需要知道哪些字段是數字字段,儘管。

+0

但在我的示例中,「無視」或數字中沒有空格。 –

+0

我假設你的數字是整數。如果他們有小數點(浮點數),字符串比較將顯然失敗。 – karakfa

+0

據我所知,它們沒有小數點,但是當我將該csv導入到R中時,它們不被視爲整數,而是作爲「數值」處理。 –