у меня есть две большие вкладки разделенных файлов 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 раза больше памяти?
слово «User1» существует в вашем списке.tsv? Должно ли это? Если нет, то почему? Удачи. – shellter
Да, слово «User1» существует в файле, строка заголовка, содержащая идентификатор, AGE или INCOME, нет, я думаю, что это там, потому что аргумент GNU parallel --pipe не работает на втором этапе и обрабатывает вывод как файл аргумент name, но не stdin, я не знаю почему. – Bamqf
, в то время как я очень ценю краткие файлы примеров, непонятно, зачем вам нужны параллельные и xargs. должно быть легко создать oneliner с awk, который делает то, что вы хотите, если у вас нет терабайт данных для обработки. Удачи! – shellter