質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

2回答

1221閲覧

while read, awkを使って表中の指定の列から複数のキーワードを検索したい

kka

総合スコア2

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2022/05/23 13:11

下の記事を参考に、表中の指定の列からgrepのような検索を行いたいと考えています。
【Linux】awkコマンドを用いて指定列を特定のキーワードで検索する
https://www.mtioutput.com/entry/2017/08/11/162306

タブ区切りtest.tableファイルの3列目の中に、test_list中の文字列と完全一致するものがあった場合、その行ごとtest.tableから抽出したいです。
そこで、下のようなコマンドを実行してみたのですが、うまくいきません (なにも起こらない)。解決策をご教授いただきたいです。

bash

1cat test_list | while read line; do 2cat test.table | awk 'BEGIN{FS="\t"} $3 == "${line}" {print $0}' 3done

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

'(一重引用符)で囲んだ中ではシェル変数は展開されませんので、お書きのコードでは
「第3列が、${line}という文字列と同じ場合に出力する」となります。

シェル変数を展開するには、一重引用符の外に出す必要があります。その上でその変数部分だけ二重引用符で囲みます。

sh

1awk 'BEGIN{FS="\t"} $3 == "'"${line}"'" {print $0}'

あるいは、全体を囲むのを二重引用符にして、内部の" $ \に全部\を前置するという方法もありますが、面倒で見にくいだけです。

-vオプションで、シェル変数値をawk変数に代入して、FS-Fオプションで指定し、

sh

1awk -F '\t' -v "line=${line}" '$3 == line'

とするのが普通です、この場合は条件部があるので{print $0}は省略可能です。

投稿2022/05/23 14:00

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kka

2022/05/23 14:24

ご親切に解説いただきましてありがとうございます。大変助かります。
guest

0

ベストアンサー

bash

1cat test_list | while read line; do 2 cat test.table | awk -F'\t' -vline="$line" '$3 == line' 3done

投稿2022/05/23 13:30

melian

総合スコア19767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kka

2022/05/23 13:58

ありがとうございます。このコマンドでやりたかったことができました。 -vline= という部分で一体何が起こっているのでしょうか?どんなワードでネット検索すると情報が得られるでしょうか? 無知ですみません。無視していただいても結構です。
melian

2022/05/23 14:06

シェル変数($line)を awk 内部の変数(line)にマッピングしています。"awk assign variable" で検索してみてください。
kka

2022/05/23 14:21

コメントありがとうございます。教えていただいた情報をもとに色々試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問