VLOOKUP から脱却する

ある業務の引継ぎを受けたときに、なんでこんなことやってるか分からないけど忙しすぎて何も考えずに手順通りに2回実施したあと、やっぱりなんでこんなことやってるか分からないと思えたときのメモ。

灯台下暗しというかなんというか…

引継ぎメモ一部抜粋

1. ログを2種類取得する
2. 1つを、Sheet1に張り付ける
3. 1つを、Sheet2に張り付けて、B列に「1」などの文字を入れる
4.. Sheet1のB列にVLOOKUP 関数を仕込む

=VLOOKUP(A1,Sheet2!A:B,2,FALSE)

5. Sheet1のB列を N/A でフィルタする
6. フィルタしたSheet1のA列のデータをテキストにはりつけて、txtで保存する

たぶんていうかつまり

Sheet1 と Sheet2 から重複していないデータを取得したい…んだよねきっと。shell とかでぜったい一瞬でできるやろと思ってぐぐったけど、検索能力が低いのか、思っている記事に hit しない。

ちょっと近い。やってみる。

Sheet1.txt

a
b
c
d
e
f
g

Sheet2.txt

b
c
d

sample1.awk

#!/bin/awk -f
# cat Sheet1.txt | awk -F, -v file=Sheet2.txt -f sample1.awk
# 改行はLF
# 日本語の場合文字コードはUTF8
BEGIN {
   DATA="|";
   CAT = "cat " file;
   while ((CAT | getline) > 0) {
       DATA = DATA "" $0 "|";
   }
   close(CAT);
}
$1!=""{
   ITEM = "|" $1 "|";
   if (index(DATA, ITEM) >0) {
       print $0;
   }
}

結果

cat Sheet1.txt | awk -F, -v file=Sheet2.txt -f sample1.awk
b
c
d

いえす記事の通り。でもこれだとマッチしたときなので、逆がやりたい。sed とか cut とか grep がギリの女なので分からない。エンジニア様に聞いてみた。

神の声

if (index(DATA, ITEM)==0) {
試していないけど、これでいけるんじゃないでしょうか。

いけました。

cat Sheet1.txt | awk -F, -v file=Sheet2.txt -f sample1.awk
a
e
f
g

ありがとうございますありがとうございます🙏

さらに神の声

egrepを使ったほうが簡単です。

神すぎる。自分が無知すぎる。

egrep -v -f Sheet2.txt Sheet1.txt
a
e
f
g

いけました。

さいこうです。

この記事が気に入ったらサポートをしてみませんか?