【问题标题】:GNU parallel used with xargs and awkGNU 并行与 xargs 和 awk 一起使用
【发布时间】: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


【解决方案1】:
$ for I in $(seq 8 2 22); do echo -e "User$I\t$I" >> A.txt; done; cat A.txt
User8   8
User10  10
User12  12
User14  14
User16  16
User18  18
User20  20
User22  22

$ for I in $(seq 8 2 22); do echo -e "User$I\t100${I}00" >> B.txt; done; cat B.txt
User8   100800
User10  1001000
User12  1001200
User14  1001400
User16  1001600
User18  1001800
User20  1002000
User22  1002200

$ cat A.txt | parallel --pipe -q awk '{if ($2 >= 10 && $2 <= 20) print $1}' > list.txt
$ cat B.txt | parallel --pipe -q grep -f list.txt
User10  1001000
User12  1001200
User14  1001400
User16  1001600
User18  1001800
User20  1002000

【讨论】:

  • 谢谢,但我需要一个支持并行计算的解决方案
  • 我加parallel --pipe -q
猜你喜欢
  • 2012-04-05
  • 1970-01-01
  • 2012-10-21
  • 2017-09-27
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多