与xargs和awk一起使用的GNU并行

时间:2014-02-12 19:37:53

标签: awk parallel-processing xargs gnu-parallel

我有两个大的制表符分隔文件A.tsv和B.tsv,它们看起来像(标题不在文件中):

A.tsv:  
ID AGE  
User1  18   
...

B.tsv:  
ID INCOME  
User4  49000  
...

我想在A中选择ID列表,使得10 =< AGE< = 20并选择B中与列表匹配的行。我想使用GNU并行工具。我的尝试是两步:

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倍,这种方法也能工作吗?

1 个答案:

答案 0 :(得分:3)

$ 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