2015-11-05 46 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中时,它们不被视为整数,而是作为“数值”处理。 –