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