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

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

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Linux

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

4回答

3203閲覧

Shell(Linuxコマンド)を用いて2つのリストを参照し、一致する特定の行を抽出したいです

player31

総合スコア21

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Linux

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

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

1クリップ

投稿2020/03/24 14:21

Linuxのコマンドを用いて、下記のような[List-1][List-2]の2つのリストを参照し、一致する特定の行を抽出したいです。
具体的には、List-1のID列をキー値としてList-2のID列を参照し、IDが一致する行のみを取ってきて表示させたいと思っています。

<List-1>
ID
21
32
5
10
8

<List-2>
Name ID Value
popo 32 1000
taro 15 4000
pipi 8 8000
mike 10 2500
john 99 8700

<表示させたい結果>
Name ID Value
popo 32 1000
mike 10 2500
pipi 8 8000

grepコマンドやcommコマンドを使って試してみましたがなかなか上手くできません。
pythonを用いて行うことも考えていますが、なるべくshellで行いたいと思っています。

もしわかる方がいらっしゃいましたらぜひ教えていただけたら幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

質問の出力例では行の順序が入れ替わっている部分がありますが、これは記述ミスですよね?

下記の前提があれば、fgrep -w -f list-1 list-2で可能です。
「list-2のNameやValueの値で、ちょうどlist-1のIDと一致する値が無い」

上記条件が満たされない場合、awkでしょうか。

sh

1awk '!F{ID[$1]=1;next}{if($2 in ID) print}' list-1 F=1 list-2

投稿2020/03/24 15:21

編集2020/03/24 15:23
otn

総合スコア85901

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

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

takasima20

2020/03/24 15:28

おー、awk で in とか使えるんスねえ。 だったらこの方法がよさそうですな~
hidezzz

2020/03/24 16:00

引数リストの間に「F=1」(変数の変更)を挟むやり方は今まで知りませんでした。 awkで目的の違うファイルを複数扱う場合に便利だと思うので今後使いたいと思います。
Y.H.

2020/03/25 02:43

> 行の順序が入れ替わっている list-1記載のID出現順だと思います。 ※そこまでこだわっての質問かどうかはわかりませんが・・・
player31

2020/03/28 05:53

回答ありがとうございます。お陰様でやりたいことができました!とても勉強になりました。
guest

0

awkかperl向きの作業でしょう。

# test.awk BEGIN{ while((getline < "list1.txt") > 0){ ids[$0]=1 } } { for(id in ids){ if($2+0 == id+0){print} } }
awk -f test.awk list2.txt

追記:
forループを使う必要はなかった…otnさんのコードのほうがベターですね。

投稿2020/03/24 15:12

編集2020/03/24 17:00
KojiDoi

総合スコア13692

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

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

player31

2020/03/28 05:55

回答ありがとうございます。ベストアンサーに選べなくて申し訳ございません。とてもためになりました!ありがとうございます。
guest

0

grep(or egrep)でならこんな感じですかね
出力順は質問記載のとおり list1 のID出現順です。

bash

1cat list1.txt | xargs -n 1 -I{} egrep "^.*\s+{}\s+.*$" list2.txt 2# cat list1.txt | xargs -n 1 -I{} grep -E "^.*\s+{}\s+.*$" list2.txt

console

1$ cat list1.txt | xargs -n 1 -I{} grep -E "^.*\s+{}\s+.*$" list2.txt 2Name ID Value 3popo 32 1000 4mike 10 2500 5pipi 8 8000

投稿2020/03/25 02:38

編集2020/03/25 02:41
Y.H.

総合スコア7918

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

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

player31

2020/03/28 05:52

ご丁寧な回答ありがとうございます。また、ベントアンサーにできなくて申し訳ございません。出現順も考慮したいと思っていたので、大変助かりました。
guest

0

たぶん Python などを使う方がスマートに書けると思いますが…

#!/bin/sh head -1 list-2 cat list1 | \ while read k do awk '$2=="'$k'" {print}' list-2 done

動作確認してませんが、イメージ的にはこんな感じで。
awk を使いたくないなら、grep を使って検索するシェルスクリプトを
用意するのでしょうが、キーを切り出すとこが面倒かなあ。
キーごとに list-2 を何回も検索するので効率わるいです
が、まあ、自分的な落としどころはこのへんかなあ、と。
データ量しだいでどの方法をとるか判断が分かれますかね。

投稿2020/03/24 15:18

takasima20

総合スコア7464

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

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

player31

2020/03/28 05:54

回答ありがとうございます。さまざまな方法があることをしれて、とても勉強になりました!次もご教示いただけたら幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問