2014-02-12 5 views
2

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

A.tsv: 
ID AGE 
User1 18 
... 

B.tsv: 
ID INCOME 
User4 49000 
... 

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

+0

слово «User1» существует в вашем списке.tsv? Должно ли это? Если нет, то почему? Удачи. – shellter

+0

Да, слово «User1» существует в файле, строка заголовка, содержащая идентификатор, AGE или INCOME, нет, я думаю, что это там, потому что аргумент GNU parallel --pipe не работает на втором этапе и обрабатывает вывод как файл аргумент name, но не stdin, я не знаю почему. – Bamqf

+0

, в то время как я очень ценю краткие файлы примеров, непонятно, зачем вам нужны параллельные и xargs. должно быть легко создать oneliner с awk, который делает то, что вы хотите, если у вас нет терабайт данных для обработки. Удачи! – shellter

ответ

2
$ 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 
+0

Спасибо, но мне нужно решение, которое позволяет использовать параллельные вычисления – Bamqf

+0

Я добавляю 'parallel -pipe -q' – user32

Смежные вопросы