代码之家  ›  专栏  ›  技术社区  ›  Olorin.G

Bash:嵌套循环单向比较

  •  0
  • Olorin.G  · 技术社区  · 7 年前

    我有一个每行一个文件名的输入文件(完整路径) 我读了这个文件,然后做了一个嵌套循环:

        for i in $filelines ; do
        echo $i
        for j in $filelines ; do
             ./program $i $j
        done
    done
    

    循环中的程序I相当低。 基本上,它比较文件A和文件B。

    我想跳过vs比较(即将一个文件与其LEF进行比较),然后 我希望避免排列(即,对于文件A和B,仅对B执行A,而不是对A执行B)。

    执行此操作最简单的方法是什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Nic3500 tpdi    7 年前

    版本2:这一个负责排列

    #!/bin/bash
    
    tmpunsorted="/tmp/compare_unsorted"
    tmpsorted="/tmp/compare_sorted"
    
    >$tmpunsorted
    
    while read linei
    do
        while read linej
        do
            if [ $linei != $linej ]
            then
                echo $linei $linej | tr " " "\n" | sort | tr "\n" " " >>$tmpunsorted
                echo >>$tmpunsorted
            fi
        done <filelines
    done <filelines
    
    sort $tmpunsorted | uniq > $tmpsorted
    
    while read linecompare
    do
        echo "./program $linecompare"
    done <$tmpsorted
    
    # Cleanup
    rm -f $tmpunsorted
    rm -f $tmpsorted
    

    此处所做的工作:

    • 我使用while循环读取每一行,两次,I和j
    • 如果行的值相同,则忘记它们,没有必要考虑它们
    • 如果它们不同,则将其输出到文件中($tmpunsorted)。在转到$tmpunsorted文件之前,它们按字母顺序排序。这样,参数的顺序总是相同的。所以 a b b a 将在未排序的文件中相同。
    • 然后我申请 sort | uniq 在$tmpunsorted上,结果是单个参数对的列表。
    • 最后循环$tmpsorted文件,并在每个单独的对上调用程序。
    • 由于我没有你的程序,我做了一个echo,你应该删除它才能使用脚本。