我要比较几个文件。 con和ref文件包含应比较的.txt文件的路径列表,并且输出应包含con_vs_ref_1.txt的变量名。
con:
/home/POP_xpclr/A.txt
/home/POP_xpclr/B.txt
参考:
/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
答案 0 :(得分:1)
代码注释。
# 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
答案 1 :(得分:1)
在bash中,遍历con和ref文件中的文件路径非常容易。
至于“输出应包含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)
创建一个子shell,然后运行cat
来读取您的CON文件,然后将输出(即所有文件路径)插入脚本中for FILE1 in $(cat $CON)
创建一个循环,一次循环遍历从CON文件读取的所有值,并一次将其分配给FILE1变量。for FILE2 in $(cat $REF)
如上,但带有REF文件。${FILE1%.txt}
插入FILE1变量的值,并从末尾删除扩展名“ .txt”。这称为parameter expansion。$(basename ${FILE1%.txt})
像以前一样创建一个子外壳,basename
剥离所有前导目录的路径,仅返回文件名,该文件名我们已经通过参数扩展除去了“ .txt”扩展名。 OUTFILE="$OUTDIR/$(basename ${FILE1%.txt})_vs_$(basename ${FILE2%.txt})_1.txt"
结合了以上两个点,以根据您的公式创建新的文件路径。do
和done
是for循环结构的一部分,我希望这些解释很容易。