Параллельное использование GNU с xargs и awk

У меня есть два больших файла, разделенных табуляцией, A.tsv и B.tsv, они выглядят так (заголовок в файле отсутствует):

A.tsv:  
ID AGE  
User1  18   
...

B.tsv:  
ID INCOME  
User4  49000  
...

Я хочу выбрать список идентификаторов в A таким образом, чтобы 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 раза больше памяти?


person Bamqf    schedule 12.02.2014    source источник
comment
существует ли слово «User1» в вашем list.tsv? Должен ли? Если нет, то почему он там? Удачи.   -  person shellter    schedule 13.02.2014
comment
Да, слово «User1» существует в файле, строка заголовка, содержащая ID, ВОЗРАСТ или ДОХОД, отсутствует, я думаю, она там, потому что аргумент GNU parallel --pipe не работает на втором шаге и обрабатывает вывод как имя файла аргумент, но не стандартный ввод, я не знаю, почему.   -  person Bamqf    schedule 13.02.2014
comment
хотя я очень ценю краткие примеры файлов, неясно, зачем вам нужны parallel и xargs. должно быть легко создать oneliner с awk, который делает то, что вы хотите, если у вас нет терабайт данных для обработки. Удачи!   -  person shellter    schedule 13.02.2014


Ответы (1)


person    schedule
comment
Спасибо, но мне нужно решение, обеспечивающее параллельные вычисления. - person Bamqf; 13.02.2014
comment
я добавляю parallel --pipe -q - person user32; 13.02.2014