手仕事ノート: bashで集合操作

YAML仕事でたまに bash で色々とやりたくなってしまうことがある。 で集合操作を bash で乗り切りたくなったことがあった。

適切なDSLを提供するツールを挟めという話はとてもわかる)

AB A \cap B

1
cat ./A.txt ./B.txt | sort | uniq -d

AB A \cup B

1
cat ./A.txt ./B.txt | sort -u

A×B A \times B

1
2
3
4
5
for a in $(cat ./A.txt); do
  for b in $(cat ./B.txt); do
    echo "${a},${b}"
  done
done

AB A \veebar B

1
cat ./A.txt ./B.txt | sort | uniq -u

AB A \setminus B

1
(cat ./A.txt ./B.txt | sort -u; cat ./B.txt) | sort | uniq -u

番外: SA(:alphabet)k S \in A(:\text{alphabet})^k

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ cat ./gen_str.sh
#!/usr/bin/env bash

function A() {
  cat <<EOF
a
b
c
EOF
}

function gen_str() {
  local alp=$1
  local prefix=$2
  local current=$3
  if [ $current -eq 0 ]; then
    echo $prefix
  else
    for c in $($alp); do
      gen_str $alp ${prefix}${c} $((current - 1))
    done
  fi
}
gen_str A "" $k