JOIN не распознает имена файлов, хранящиеся в элементах MAPFILE - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь объединить 65 файлов с помощью общего столбца поиска, первого столбца. Я тестирую части кода в командной строке и имею проблемы с элементами MAPFILE в качестве ввода JOIN. Я безуспешно пробовал несколько разных способов повторения элементов MAPFILE. Когда я заменяю элементы именами файлов, которые они представляют, это работает правильно. Как я могу передать элементы MAPFILE в JOIN?

cat list.txt | ( mapfile -t; echo "${MAPFILE[@]}" ) | join -11 -21 -a1 -a2 -o1.1,1.2,2.2 -e0 ${MAPFILE[1]} ${MAPFILE[2]} >countmatrix.txt

Другие попытки:

cat list.txt | ( mapfile -t; echo "${MAPFILE[@]}" ) | (file1=$(echo ${MAPFILE[1]}); file2=$(echo ${MAPFILE[2]})) | join -1 -2 -a -o1.1,1.2,2.2 -e0 $file1 $file2 >countmatrix.txt

cat list.txt | ( mapfile -t; echo "${MAPFILE[@]}" ) | (file1=$(echo ${MAPFILE[1]}); file2=$(echo ${MAPFILE[2]}); join -11 -21 -a1 -a2 -o1.1,1.2,2.2 -e0 <(sort $file1) <(sort $file2) >countmatrix.txt)

1 Ответ

0 голосов
/ 16 октября 2019

Вы выполняете mapfile в подоболочке, и назначенная переменная ${MAPFILE[@]} недоступна из родительского процесса.

Пожалуйста, попробуйте что-то вроде:

cat list.txt | ( mapfile -t; echo "${MAPFILE[@]:0:2}" ) | xargs join -11 -21 -a1 -a2 -o1.1,1.2,2.2 -e0 > countmatrix.txt

Учитывая, что имена файлов, определенные в list.txt, содержат пробелы и / или другие специальные символы, будет безопаснее сказать:

cat list.txt | ( mapfile -t; printf "%s\0" "${MAPFILE[@]:0:2}" ) | xargs -0 join -11 -21 -a1 -a2 -o1.1,1.2,2.2 -e0 > countmatrix.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...