Как перебрать несколько файлов в Bash - PullRequest
0 голосов
/ 25 июня 2019

У меня есть несколько файлов для сравнения.Файлы con и ref содержат список путей к файлам .txt, которые необходимо сравнить, а выходные данные должны содержать имя переменной con_vs_ref_1.txt.

con:

/home/POP_xpclr/A.txt
/home/POP_xpclr/B.txt

ref:

/home/POP_xpclr/C.txt
/home/POP_xpclr/D.txt
#!/usr/bin/env bash

XPCLR="/home/Tools/XPCLR/bin/XPCLR"
CON="/home/POP_xpclr/con"
REF="/home/POP_xpclr/ref"
MAPS="/home/POP_xpclr/1"
OUTDIR="/home/POP_xpclr/Results"

$XPCLR -xpclr $CON $REF $MAPS $OUTDIR -w1 0.5 200 1000000 $MAPS -p1 0.95

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Зацикливание путей к файлам в ваших файлах con и ref довольно легко в bash.

Что касается того, что «вывод должен содержать имя переменной con_vs_ref_1.txt», вы не очень хорошо объяснили, что вы хотите, но я предполагаю, что вы хотите, чтобы созданный файл был назван в соответствии с этой формулой и внутри выходной каталог. Что-то вроде /home/POP_xpclr/Results/A_vs_C_1.txt.

#!/usr/bin/env bash

XPCLR="/home/Tools/XPCLR/bin/XPCLR"
CON="/home/POP_xpclr/con"
REF="/home/POP_xpclr/ref"
MAPS="/home/POP_xpclr/1"
OUTDIR="/home/POP_xpclr/Results"

for FILE1 in $(cat $CON)
do
    for FILE2 in $(cat $REF)
    do
        OUTFILE="$OUTDIR/$(basename ${FILE1%.txt})_vs_$(basename ${FILE2%.txt})_1.txt"
        $XPCLR -xpclr $FILE1 $FILE2 $MAPS $OUTFILE -w1 0.5 200 1000000 $MAPS -p1 0.95
    done
done

Что это делает ...

  • $(cat $CON) создает подоболочку и запускает cat для чтения вашего файла CON, вставляя вывод (т.е. все пути к файлам) в сценарий в этот момент
  • for FILE1 in $(cat $CON) создает цикл, в котором все значения, считанные из вашего файла CON, повторяются и присваиваются переменной FILE1 по одному.
  • for FILE2 in $(cat $REF) как указано выше, но с файлом REF.
  • ${FILE1%.txt} вставляет значение переменной FILE1 с расширением ".txt", удаленным с конца. Это называется расширение параметра .
  • $(basename ${FILE1%.txt}) делает подоболочку, как и раньше, basename удаляет путь всех ведущих каталогов и возвращает только имя файла, которое мы уже удалили из расширения ".txt" с расширением параметра.
  • OUTFILE="$OUTDIR/$(basename ${FILE1%.txt})_vs_$(basename ${FILE2%.txt})_1.txt" объединяет две вышеуказанные точки для создания нового пути к файлу на основе вашей формулы.
  • do и done являются частями конструкции цикла for, которые, я надеюсь, довольно понятны.
1 голос
/ 25 июня 2019

Комментарии в коде.

# create an MCVE, ie. input files:
cat <<EOF >con
/home/POP_xpclr/A.txt
/home/POP_xpclr/B.txt
EOF

cat <<EOF >ref
/home/POP_xpclr/C.txt
/home/POP_xpclr/D.txt
ref

# join streams
paste <(
    # repeat ref file times con file has lines
    seq $(<con wc -l) |
    xargs -i cat ref
) <(
    # repeat each line from con file times ref file has lines
    # from https://askubuntu.com/questions/594554/repeat-each-line-in-a-text-n-times
    awk -v max=$(<ref wc -l) '{for (i = 0; i < max; i++) print $0}' con
) |
# ok, we have all combinations of lines
# now read them field by field and do whatever we want
while read -r file1 file2; do
     # run the compare function
     cmp "$file1" "$file2"
     # probably you want something along:
     "$XPCLR" -xpclr "$file1" "$file2" "$MAPS" "$OUTDIR" -w1 0.5 200 1000000 "$MAPS" -p1 0.95
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...