包以查询bash中的制表符分隔文件

时间:2015-04-06 21:28:52

标签: mysql bash awk

我经常要对bash中的制表符分隔文件进行非常简单的查询。例如,对第n列中的所有值求和/计数/最大/最小。我通常通过命令行在awk中执行此操作,但我已经厌倦了一遍又一遍地重写相同的一行脚本,我想知道是否有已知的包或解决方案。

例如,考虑文本文件(test.txt):

apples   joe    4
oranges  bill   3
apples   sally  2

我可以将其视为:

awk '{ val += $3 } END { print "sum: "val }' test.txt

另外,我可能想要一个where子句:

awk '{ if ($1 == "apples") { val += $3 } END { print "sum: "val }' test.txt

或小组:

awk '{ val[$1] += $3 } END { for(k in val) { print k": "val[k] } }' test.txt

我宁愿做的是:

query 'sum($3)' test.txt
query 'sum($3) where $1 = "apples"' test.txt
query 'sum($3) group by $1' test.txt

@Wintermute在下面的评论中发布了一个很棒的工具链接。不幸的是,它确实有一个缺点:

$ time gawk '{ a += $6 } END { print a }' my1GBfile.tsv 
28371787287

real    0m2.276s
user    0m1.909s
sys 0m0.313s

$ time q -t 'select sum(c6) from my1GBfile.tsv'
28371787287

real    3m32.361s
user    3m27.078s
sys 0m1.983s

它还会将整个文件加载到内存中,显然在某些情况下这是必要的,但对我来说并不适用,因为我经常使用大文件。

1 个答案:

答案 0 :(得分:0)

Wintermute's回答:像q这样可以直接在CSV上运行SQL查询的工具。

Ed Morton's回答:请参阅https://stackoverflow.com/a/15765479/1745001