Help us understand the problem. What is going on with this article?

awkで別ファイルのリストとマッチしている行のみ抽出させる

More than 5 years have passed since last update.

awk便利ですね。便利すぎてなんでもawk使おうとするんですが、範囲を広げるともどかしいことも増えてきます。

今回は、標準入力とは別に「IDとか名前とかキーワードとかの一覧が並んでいるテキストファイル」を読み込んで、どの行かと標準入力の1番目がマッチしたらその行を返すというスクリプトをご紹介します。

ロジックが簡単なので1度理解してしまえば、コピペでスクリプト貼り付けて一分で抽出始められます!

awkのバージョンによっては動かないかもしれません。試したのは、WindowsのCygwin 64bit版のGNU Awk 4.1.0です。

sample1.awk
#!/bin/awk -f
# cat input.txt | awk -F, -v file=keyword.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;
    }
}
keyword.txt
test1
test2
test3
input.txt
test1
test12
test123

やってることは単純に、キーワード一覧を、keyword.txtを一行ずつ読み込んで、|test1|test2|test3|という文字列に変換して、標準入力の1番目がマッチすればtrueと見なすということをやっています。

それでは充実したawkライフをお送りください。

daxanya1
2018年はVRで動かす方向で。 勉強中:Houdini,VR,FPGA,python,MODO,OpenGL,go,node,Chainer,Slack,CUDA,OpenCV,Arduino
http://enkaku.jp/blog/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away