2017-11-30 16 views
0

私はbashと入れ子になったループについてクエストを1つ持っています。Bash:ネストされたループ一方向の比較

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

プログラムIループ内ではかなり低いです:

は、私はこのファイルを読み、私はネストループを作るライン(フルパス) ごとに1ファイル名を指定して入力ファイルを持っています。 基本的にはそれだけで実行し、私は、ファイルAとBのための順列(すなわちを避けたい、私は(itslefで一つのファイルを比較するIE)の比較対スキップしたいファイルB

でファイルAを比較して、 Bに対してではなく、Bに対してではない)。

これを実行する最も簡単な方法は何ですか?

+0

ファイル名が異なる場合は、ファイル名を比較して '。/ program'を実行してください。 '$ i'と' $ j'の値を比較するには 'if'文を使います。 – Nic3500

+0

tjeプログラムは、これらのファイルに含まれている内容を比較しています。 –

+0

はい、私が提案しているのは、ファイル名を比較することです。 '$ i'と' $ j'の値はファイル名です。したがって、もしあなたがそれらを比較するためにifを実行すると、それが同じファイルであるかどうかがわかります。 – Nic3500

答えて

1

バージョン2:この1つはここで行われているどのような順列

#!/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 orderでソートされます。このようにして、引数は常に同じ順序になります。したがって、a bb aは、ソートされていないファイルと同じになります。
  • $ tmpunsortedにsort | uniqを適用すると、結果は個々の引数のペアのリストになります。
  • 最後に$ tmpsortedファイルをループし、個々のペアごとにプログラムを呼び出します。
  • 私はあなたのプログラムを持っていないので、私はエコーを行いました。これは、スクリプトを使用するために削除する必要があります。
+0

ええ 私はそれについて考えるが、それは簡単なケースを解決する対A対私は重複比較を避けるためにはA対BとB対も –

+0

ニース!私は自分のニーズに合うようにコードを軽く変更しました。それはうまくいく。 –

+0

偉大な、答えの左側にあるチェックマークで答えを受け入れることができます。ありがとう! – Nic3500

関連する問題