Bash:嵌套循环单向比较
Bash: nested loop one way comparison
我有一个关于 bash 嵌套循环的问题。
我有一个输入文件,每行一个文件名(完整路径)
我读了这个文件然后做了一个嵌套循环:
for i in $filelines ; do
echo $i
for j in $filelines ; do
./program $i $j
done
done
循环中的程序 I 非常低。
基本上它将文件 A 与文件 B 进行比较。
我想跳过 A 与 A 比较(即将一个文件与其自身进行比较)并且
我想避免排列(即对于文件 A 和 B,只对 B 执行 A 而不是对 A 执行 B)。
执行此操作最简单的方法是什么?
版本 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
在未排序的文件中将相同。
- 然后我在 $tmpunsorted 上应用
sort | uniq
,因此结果是单个参数对的列表。
- 最后在 $tmpsorted 文件上循环,并在每个单独的对上调用程序。
- 因为我没有你的程序,所以我做了一个回显,你应该删除它才能使用脚本。
我有一个关于 bash 嵌套循环的问题。
我有一个输入文件,每行一个文件名(完整路径) 我读了这个文件然后做了一个嵌套循环:
for i in $filelines ; do
echo $i
for j in $filelines ; do
./program $i $j
done
done
循环中的程序 I 非常低。 基本上它将文件 A 与文件 B 进行比较。
我想跳过 A 与 A 比较(即将一个文件与其自身进行比较)并且 我想避免排列(即对于文件 A 和 B,只对 B 执行 A 而不是对 A 执行 B)。
执行此操作最简单的方法是什么?
版本 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
在未排序的文件中将相同。 - 然后我在 $tmpunsorted 上应用
sort | uniq
,因此结果是单个参数对的列表。 - 最后在 $tmpsorted 文件上循环,并在每个单独的对上调用程序。
- 因为我没有你的程序,所以我做了一个回显,你应该删除它才能使用脚本。