我经常要对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
它还会将整个文件加载到内存中,显然在某些情况下这是必要的,但对我来说并不适用,因为我经常使用大文件。
答案 0 :(得分:0)
Wintermute's回答:像q这样可以直接在CSV上运行SQL查询的工具。
Ed Morton's回答:请参阅https://stackoverflow.com/a/15765479/1745001