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

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

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

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

626閲覧

[テキスト処理]別ファイルの番号を基にマッチしない行を削除する

aufheben

総合スコア24

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2022/01/23 18:48

タイトルの通りですが、わかりにくいかもしれないので例を挙げます。

file1(index)

10000000001 20000000002 30000000004 40000000007 50000000008 60000000010 7...

file2(index&data)

10000000001 aaa 20000000002 bbb 30000000003 ccc 40000000004 ddd 50000000005 eee 60000000006 fff 70000000007 ggg 80000000008 eee 90000000009 hhh 100000000010 iii 11...

例えばこのような2つのファイルがあった時に、indexに含まれていない番号のものをfile2から取り除きたいです。今回だと

file3(expect)

10000000001 aaa 20000000002 bbb 30000000004 ccc 40000000007 ggg 50000000008 eee 60000000010 iii

これが期待する結果です。

grepを使ったら出来そうなんですが、シェル初心者なので具体的にどうしたらいいか分かりませんでした。
ご教授お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

bash

1$ grep --version 2grep (GNU grep) 3.6 3$ sed --version 4sed (GNU sed) 4.7 5 6$ grep -E -f <(sed -E 's/^([0-9]+).*/^\1[ \t]/' file1) file2 7$ cat file3 80000000001 aaa 90000000002 bbb 100000000004 ddd 110000000007 ggg 120000000008 eee 130000000010 iii

投稿2022/01/23 19:04

編集2022/01/23 20:36
melian

総合スコア19712

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

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

aufheben

2022/01/23 19:43 編集

上記のコマンドを実行してみましたが、一番最後の0000000010 iiiしか出ませんでした。 grepとsedのバージョンを調べてみたのですが、sedが4.7, grepが3.4でした。上手くいかないのはgrepのバージョンが原因でしょうか?
melian

2022/01/23 20:38 編集

file1 の各行(0000000010 を除く)の末尾にスペースが入っているか、もしくは file2 の列の区切り文字がTABになっている(0000000010 の行のみスペース)のではないでしょうか。というわけで修正してみました。お試し下さい。
aufheben

2022/01/23 20:50

notepad++で制御文字の表示でfile1とfile2を確認してみましたが、file1の各行の末尾にスペースはなく、file2の区切り文字は全てスペースになっていました。 試しに 0000000010 iii 0000000011 ggh 0000000012 asf 0000000013 afjj 0000000014 aljkf 0000000015 54gjh このようにfile2にデータを追加して(追記)、file1を 0000000001 0000000002 0000000004 0000000007 0000000008 0000000010 0000000012 0000000014 0000000015 に変更したところ、 $ cat file3 0000000015 54gjh このように一番最後の行だけしか表示されませんでした。 逆にfile1の0000000010を削って、最後の番号を0000000008にした場合はやはり末尾の0000000008 eeeが出ました。 melianさんの環境で上手くいって私の環境で上手くいかないということはやはりgrepのバージョンが問題でしょうか。
aufheben

2022/01/23 20:52

コメントを書いているうちに編集していただいていたようで、編集後のコードで 0000000001 aaa 0000000002 bbb 0000000004 ddd 0000000007 ggg 0000000008 eee 正しい結果が得られました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問