Bash:嵌套循环单向比较

时间:2017-11-30 13:48:19

标签: bash loops nested triangular oneway

我有一个关于使用bash嵌套循环的问题。

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

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

循环中的程序非常低。 基本上它将文件A与文件B进行比较。

我想跳过A vs A比较(即将一个文件与其文件进行比较)AND 我想避免排列(即对于文件A和B,只针对B执行A而不针对A执行B)。

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

1 个答案:

答案 0 :(得分:1)

版本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文件之前,它们按照alphebetical顺序排序。这样,参数总是以相同的顺序。因此,a bb a在未排序的文件中将相同。
  • 然后我在$ tmpunsorted上应用sort | uniq,因此结果是各个参数对的列表。
  • 最后在$ tmpsorted文件上循环,并在每个对上调用该程序。
  • 由于我没有你的程序,我做了一个echo,你应该删除它以使用该脚本。