Bashで2つの配列を比較・差分する
2023-10-12 09:15:23
質問
Bashで2つの配列の差を取ることは可能でしょうか。それを行うための良い方法は何ですか?
コードです。
Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" )
Array3 =diff(Array1, Array2)
Array3 ideally should be :
Array3=( "key7" "key8" "key9" "key10" )
どのように解決するのですか?
もし、厳密に
Array1 - Array2
が必要であれば
Array1=( "key1" "key2" "key3" "key4" "key5" "key6" "key7" "key8" "key9" "key10" )
Array2=( "key1" "key2" "key3" "key4" "key5" "key6" )
Array3=()
for i in "${Array1[@]}"; do
skip=
for j in "${Array2[@]}"; do
[[ $i == $j ]] && { skip=1; break; }
done
[[ -n $skip ]] || Array3+=("$i")
done
declare -p Array3
連想配列でランタイムは改善されるかもしれませんが、個人的には気にしないことにします。 もし、それが問題になるほどのデータを操作するのであれば、shellは間違ったツールです。
Dennisの回答のような対称的な差分の場合、既存のツールである
comm
のような既存のツールは、入力と出力を少しマッサージする限り、動作します (これらはシェル変数ではなく、行ベースのファイルで動作するため)。
ここでは、配列を単一の文字列に結合するために改行を使用するようシェルに指示し、
$ oldIFS=$IFS IFS=$'\nème' $ Array3=($(comm -3 <(echo "${Array1[*]}") <(echo "${Array2[*]}")))) comm: ファイル1がソート順ではありません。 $ IFS=$oldIFS $ declare -p 配列3 declare -a Array3='([0]="key7" [1]="key8" [2]="key9" [3]="key10")' とします。
文句を言われるのは、字句の並び替えによって
comm
. しかし、どちらの入力配列も同じようにソートされているので、この警告は無視しても問題ないでしょう。 あなたは
key1 < … < key9 > key10
を使って警告を消すか、あるいは
--nocheck-order
の中に
| sort -u
の中で、入力配列の順序と一意性を保証できない場合は、置換を処理します。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bash prints リテラルの改行をエコーする \n
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptで2つの日付を比較する
-
[解決済み】Bashでファイル名と拡張子を抽出する。
-
シェルで配列からランダムに項目を選択する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MIPSで宣言された配列からの印刷
-
[解決済み] MIPSで配列を作る(アクセスする)方法
-
[解決済み] Swift Closuresの$0と$1の意味は何ですか?
-
[解決済み] MASMアセンブリの配列 (非常に混乱している初級者)
-
[解決済み] Powershellで配列の値をソートする
-
[解決済み] Bashでの2つのリストの交点
-
[解決済み] Javascript/Typescriptで配列のクローンを作成する
-
[解決済み] 1次元数配列のクラスタリング
-
[解決済み] なぜgulp.srcはファイルへの完全なパスの配列が渡されるのを好まないのですか?
-
ブロックが渡されたときのArray#sortの動作はどうなっていますか?