両方のリストを減算する簡単な方法は何ですか?1。これらのリストは小さく、シェルを使って作業する簡単な方法です。あるいは、リストが長い場合もあれば、外部ツールがより速い方法である場合もあります。
2つのリストがあるとしましょう。
list1=( 1 2 3 4 5 6 7 8 9 10 11 12 )
list2=( 1 2 3 5 7 8 9 11 12 )
listr
list1からlist2のすべての要素を削除して、次のような結果list()を取得する方法:
listr=( 4 6 10 )
リストはファイル内に配置することもできますが、リストが大きい場合(メモリが多すぎる場合)には、それを行う必要があります。
簡単にするために、すべてのアルゴリズムをコミュニティの回答に入れました。
そこで行われたさまざまなテストについて読んでください。
ㅏ
最初の問題は、重複していないlist2の完全なリスト(list1)で欠落している要素を見つけることです。
ただし、リストが次の場合:
list1=( a a b b b c d d )
list2=( b b c c c d d e )
と定義複数のエピソード減算は次のとおりです。このページから、予想される結果は次のとおりです。
listr= ( a a b )
アルゴリズム1と3のみが正しく機能します。
アルゴリズム2または4のいずれもこれを実行できません。
この定義と一致するようにアルゴリズム5(comm)を実行できますcomm -23
。
アルゴリズム6(zsh)が失敗します。私はそれを動作させる方法を知りません。
アルゴリズム7(通信)。上記のように、使用は機能-23
します。
まだすべてのアルゴリズムを分析しているわけではありません。対称差の設定定義は以下を生成する必要があります。
listr=( a a b c c e )
しかし、comm -3 list1.txt list2.txt | tr -d ' \t'
動作します。
1はい、シェルでテキストファイル(行リスト)を処理するのは悪い考えで、ゆっくりと設計されていることを知っています。
しかしそこには避けられないような状況。
私(私たち)は提案に開いています。
ベストアンサー1
comm
以下を使用して、両方のリストに共通の項目を削除できます。
listr=($(comm -3 <(printf "%s\n" "${list1[@]}" | sort) <(printf "%s\n" "${list2[@]}" | sort) | sort -n))
これは、2つのリストを予想される順序で並べ替え、比較し、両方のリストcomm
の一意の項目のみを出力し、番号順に並べ替えます。
両方のリストがアルファベット順にソートされている場合(~によるとLC_COLLATE
)、再配置を避けることができます。
listr=($(comm --nocheck-order -3 <(printf "%s\n" "${list1[@]}") <(printf "%s\n" "${list2[@]}")))
比較する必要がある値がファイルに保存されている場合でもうまく機能します。