「A」のすべての要素を含むが「B」の要素にはまったく含まれないリスト「C」が必要です。

「A」のすべての要素を含むが「B」の要素にはまったく含まれないリスト「C」が必要です。

2つのリストがあります。

より大きい「A」:

A=`echo -e '1\n2\n3\n4\n5'`
echo "$A"
1
2
3
4
5

より小さい「B」:

B=`echo -e '1\n2\n3'`
echo "$B"
1
2
3

尋ねる:しかし、「A」のすべての要素を含むが「B」は含まない3番目のリストが必要です。 bashでこれをどのように実行できますか?

echo "$C"
4
5

数字は「foo」から99まで可能です。

修正する:

シェルでは手動で動作しますが、スクリプトに入れると動作しないのでおかしいです!

cat a.txt 
A=$(seq 5)
B=$(seq 3)
comm -23 <(sort <<< "$A") <(sort <<< "$B")
sh a.txt 
a.txt: line 3: syntax error near unexpected token `('
a.txt: line 3: `comm -23 <(sort <<< "$A") <(sort <<< "$B")'

自家製動作します..:

A=$(seq 5)
B=$(seq 3)
comm -23 <(sort <<< "$A") <(sort <<< "$B")
4
5

なぜ?アップデートアップデート: "sh"の代わりにbashを使用する必要があります。 :D

ベストアンサー1

これcomm必要なコマンドは次のとおりです。

$ A=$(seq 5)
$ B=$(seq 3)
$ comm -23 <(sort <<< "$A") <(sort <<< "$B")
4
5

これは入力をソートする必要がない方法です。これは、最初のファイルをメモリに読み込み、最初のファイルに基づいて2番目のファイルをフィルタリングするawkの一般的な慣用語です。ランダムデータを使ってみよう

$ A=$(seq 5 | sort -R); echo "$A"
3
5
1
2
4
$ B=$(seq 3 | sort -R); echo "$B"
2
1
3

出力は最初は5、その後は4になると予想されます。

$ awk 'NR==FNR {b[$1]=1; next} !($1 in b) {print}' <(echo "$B") <(echo "$A")
5
4

おすすめ記事