csvquote: smart and simple CSV processing on the command line

在处理csv文本发现awk不能直接处理引号内包括逗号的数据,比如:

field1,"field2, has a comma in it","field 3 has a ""Quoted String"" in it"

这是可以使用csvquote工具来处理了,此工具需要源代码安装,代码地址:https://github.com/dbro/csvquote

Are you looking for a way to process CSV data with standard UNIX shell commands?

Are you running into problems with embedded commas and newlines that mess everything up?

Do you wish there was some way to add some CSV intelligence to these UNIX tools?

awk, sed
cut, join
head, tail
sort, uniq
wc, split
This program can be used at the start and end of a text processing pipeline so that regular unix command line tools can properly handle CSV data that contain commas and newlines inside quoted data fields.

ubuntu @aliyun 缺少syslog问题

之前使用过程中一直没有注意,今天在调试incron的时候才发现/var/log下没有syslog日志。

搜索到这个帖子:https://bbs.aliyun.com/read/286708.html

看了后,发现问题在rsyslog的配置文件中:/etc/rsyslog.d/50-default.conf

注意这一行:

*.*;auth,authpriv.none -/var/log/syslog

把/var/log/syslog前面的减号去掉就可以解决此问题。

同时,帖子里还提到了目录权限问题:

chown -R syslog:adm /var/log

遭遇QGIS的一个crash bug:control feature rendering order

“Control feature rendering order”是QGIS一个很好的特性,特别是在点位密集的时候,若要根据不同属性展示重要性程度的时候。
但在点位数据量较大的时候,会引起QGIS崩溃。之前也遇到了一次,但当时是想办法绕过了(让点位按照真实世界的尺寸进行绘制,从而避免重叠问题)。这次遇到同样的问题,就仔细测试了一下,看看到底是什么问题。
1. 是否是数据格式的问题
原始数据是csv格式,尝试将其转换为shape file以及导入到postgis数据库。发现依旧是崩溃。

2. 是否是数据排序的问题
将原始数据按照期望的顺序进行事先排序,在不选择control feature rendering order时,绘图结果是满足需求了。但选择此绘图特性后,结果依旧。

3. 是否是数据大小的问题
将原始数据逐步缩小数据量,发现在3.05万行-3.1万行之间是个分水岭(大约1M数据量)。3.05万行不崩溃,3.1万行崩溃。说明此问题和内存相关?

4. 是否版本的影响?
尝试了2.18-0,2.18-2两个版本,以及mac sierra 10.12.2, 10.12.3两个版本,不影响测试结果。

5. 是否受操作系统的影响?
在virtualbox虚拟机里的ubuntu 16.04,QGIS 2.14版本,虽然很慢,但不崩溃。

尝试将此bug汇报给qgis开发组,但找了很久file bug的地方,最终发现还需要osgeo的账号,幸亏很久之前注册过账号,找回密码后提交了:

http://hub.qgis.org/issues/16025

BTW:祝新年快乐!

shell下定时监测程序的死锁

这几天在处理微博爬虫。由于各种原因,爬虫经常为会出现网络错误断开连接,有时莫名其妙的程序锁死(程序在运行,但其实没有任何输出结果显示在运行)。因此就产生了一个定时检查所运行脚本的脚本,或者就在脚本中定时检查。但又不能将检测程序放入cron中,因为程序kill掉后还要继续向前运行。

处理方法如下:
1. 爬虫脚本将结果输出到某log文件中
2. 若log文件在一定时间内未发生变化,而且爬虫脚本还在运行,那可以认定此时程序锁死。
3. 处理锁死程序,直接kill掉,然后继续时间循环。

脚本运用了pgrep(获取某运行程序的pid)、pkill(杀死某程序)。

#!/bin/bash

#only works in Linux shell
startdate='2016-07-03'
for i in {0..7};do
echo "Running time:"`date`
tododate=`date -d "${startdate} $i days" +%Y-%m-%d`
logfile="weibo-${tododate}.log"
python -u weibo-num.py $tododate >$logfile 2>&1 &
while sleep 120;do
cmd=`pgrep -f "weibo-num.py ${tododate}"`
delta=$((`date +%s`-`date -r $logfile +%s`))
if [ ! -z $cmd ] && [ $delta -ge 900 ];then
pkill -f "weibo-num.py ${tododate}"
break
elif [ -z $cmd ]; then
break
fi
done
done

shell下python脚本的输出转向

一个用python写的脚本,在本地测试的时候用python的print输出了一些状态信息,用于观测程序运行的状况。脚本自身比较耗时(中间故意设置了延时)。
在部署到服务器上后,需要后台运行,因此就想当然的转向输出到一个文本log中:
python script.py > output.log &
结果发现log文件一直是空白(程序在持续运行中),但正常应该是有文本记录的。结果网上搜索才发现,python脚本默认是在脚本整个执行完成后才输出的。(参考:https://unix.stackexchange.com/questions/182537/write-python-stdout-to-file-immediately/182542#182542
当然,知道问题后解决方案也很简单:
python -u script.py > output.log &

两台服务器的缺失数据同步

一台主服务器上的部分数据文件缺失,需要在另一台备份服务器上拷贝回来,但不想使用rsync进行全局同步,因此就需要对缺失文件进行直接处理。
但文件数量比较少的时候,直接scp回来即可,但数量较多的时候,就不能人工处理了,需要使用shell脚本处理:
1. 生成缺失文件列表,如mis.txt
2. 让主服务器可以用key方式ssh到备份服务器上
3. 逐个文件导入:
while IFS='' read -r line ;do scp user@backup-server:/path/$line .; done < mis.txt

两台服务器皆为ubuntu环境。

使用AWK过滤数据

现有大批量的文本数据,需要截取其中符合一定范围的数据(减少数据量)。数据的格式如下:

42.69,-84.6,1
41.74,-86.21,1
42.26,-83.73,2
43.01,-83.68,6
42.74,-84.48,3
42.29,-83.7,4
42.29,-83.25,2
41.36,-82.07,1
42.99,-83.73,3
42.24,-84.41,1

其中,截取的目标范围是第一列的数字在一定范围,如40-44,第二列在另个范围。
开始我是将其全部导入到数据库中(copy命令),然后再进行delete操作,但随数据的处理,数据库的速度越来越慢,导致数据的处理速度不可接受。因此想在入库前就先行截取。Google后发现了解决方案:Using AWK to Filter Rows
具体解决方案如下:
awk -F',' '{ if($1 <= 44.0 && $1>=41.0 && $2<=-82.0 && $2>=-87.0) {print }}' 20161026-2300-point.csv

数据巧处理:重复数据的合并处理

要处理一批数据,形式为:
lat,lon,num
每个文件有一个timestamp,文件数量巨大,开始我感觉lat、lat应该唯一,但后来检查数据后发现,这批数据存在大量重复的点(可能之前高精度数据是唯一的,但精度降低后导致有重复数据出现),因此需要专门处理。
开始是想在bash里直接处理,但点位相同的数据,其后的num感觉应该sum后替换,因此还没有想到较好的方法。
后来一想数据不是要入库么,入库后先放松唯一性检查,然后通过group操作,可以简单获取到对应的结果。
SQL:
create table sum_point as
select ts,lat,lon,sum(num) from point group by ts,lat,lon