如何遍历bash中的几个文件

时间:2019-06-25 13:18:30

标签: bash

我要比较几个文件。 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

2 个答案:

答案 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"结合了以上两个点,以根据您的公式创建新的文件路径。
  • dodone是for循环结构的一部分,我希望这些解释很容易。