【发布时间】:2014-03-11 08:48:38
【问题描述】:
我有两个大的制表符分隔文件 A.tsv 和 B.tsv,它们看起来像(文件头不在文件中):
A.tsv:
ID AGE
User1 18
...
B.tsv:
ID INCOME
User4 49000
...
我想选择 A 中的 ID 列表,使得 10=
cat A.tsv | parallel --pipe -q awk '{ if ($3 >= 10 && $3 <= 20) print $1}' > list.tsv
cat list.tsv | parallel --pipe -q xargs -I% awk 'FNR==NR{a[$1];next}($1 in a)' % B.tsv > result.tsv
第一步有效,但第二步出现如下错误:
awk: cannot open User1 (No such file or directory)
我该如何解决这个问题?即使 A.tsv 和 list.tsv 比内存大 2 到 3 倍,这种方法是否有效?
【问题讨论】:
-
list.tsv 中是否存在“User1”一词?应该是?如果没有,为什么会在那里?祝你好运。
-
是的,文件中存在“User1”这个词,包含 ID 、AGE 或 INCOME 的标题行不存在,我猜它在那里是因为 GNU 并行的 --pipe 参数在第二个中不起作用步骤并将输出视为文件名参数而不是标准输入,我不知道为什么。
-
虽然我非常欣赏简短的示例文件,但不清楚为什么需要并行和 xargs。假设您没有 TB 的数据要处理,那么使用 awk 构建一个可以满足您需求的 oneliner 应该很容易。祝你好运!
标签: awk parallel-processing xargs gnu-parallel