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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

2回答

1260閲覧

2つのファイルの文字列を比較して一致した場合の削除方法について

naizawa

総合スコア16

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2020/10/21 13:01

いつもお世話になっております。
考えても思い浮かばない状況に陥ってしまいましたので、質問させていただきます。

下記の「ファイル2」の行頭が「"連番の数字"」で始まる文字列が、ファイル1と一致した場合、ファイル1から記述を行ごと削除したいと考えております。

各ファイルはそれぞれ、csvファイルであり改行されております。

■ファイル1 ※某グループウェアより取得した予約情報

bash

1# cat post_list.csv 2"36","来訪","会議室予約1","123456","2020-10-25T10:00:00+09:00","2020-10-25T11:00:00+09:00","hoge@hogehoge.com","test01hogehoge.com" 3"37","会議","会議室予約2","234567","2020-10-25T11:00:00+09:00","2020-10-25T12:00:00+09:00","hoge@hogehoge.com","test02hogehoge.com"

■ファイル2 ※ファイル1の登録処理が完了すると追記されるファイル

bash

1# cat post_ok_list.csv | cut -d, -f1 2"1" 3 <省略> 4"35" 5"36" 6"37"

重複しているかの確認として、行頭の数字が適していると判断し、
「while read line;do」で1行ずつ読み込んで処理させてみたりと色々と試したのですが、
思うような結果が得られませんでした。

また、「uniq -w 1」なども試してみましたが、他に良い方法があればご教授願えませんでしょうか。

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ソートして良ければ、joinを使うと応用が利くかもしれません。

Bash

1join -t, -j 1 -v 1 <(sort -t, file1) <(sort -t, file2)

質問のケースだけなら、grepで。

Bash

1grep -v -f <(sed 's/^/^/' file2) file1

投稿2020/10/21 14:06

otn

総合スコア85901

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

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

naizawa

2020/10/22 04:53

回答ありがとうございます。ファイル2について「 | cut -d, -f1」で表示させていない状態でしたら動作しました。ですが、こちらの記述の仕方が悪かったのですが、ファイル2については、「"連番数字"」のみのファイルとなっております。 出力結果としては、何も表示されず、エラーコード$?=1となってしまいます。
naizawa

2020/10/22 06:28

大変申し訳ございません、joinの方で目的の結果を得る事ができました。
naizawa

2020/10/22 07:12

joinの方ですが、プロンプトでは成功しますが、bashで実行すると。「予期しないトークン `(' 周辺に構文エラーがあります」となってしまいます。 「\」で括ってみたのですが駄目そうです。 もし解決方法をご存じでしたらご教授ねがえませんでしょうか。
naizawa

2020/10/22 08:05

「#!/bin/bash」を明記して「sh hogehoge.sh」で実行していたのですが、 「# bash hogehoge.sh」として実行することで、解決しました。 お騒がせしました。ちなみにCentOS 7.8の環境となります。
otn

2020/10/22 10:08

<( ~~ ) という構文は、bashもしくはzshで。 sh hogehoge.sh だと、shで実行されます。
otn

2020/10/22 10:13

> ファイル2については、「"連番数字"」のみのファイルとなっております。 だと大丈夫ですが、 「ファイル2については、「"連番数字"」のみのファイルではありません。」 の間違いですかね? であれば、cut -d, -f1 を入れて、 grep -v -f <(cut -d, -f1 file2 | sed 's/^/^/') file1
guest

0

linuxでは以下の手順で行けそうでした。

sed 's/^/^/' ファイル2 > temp.txt egrep -f temp.txt ファイル1

投稿2020/10/21 13:35

KojiDoi

総合スコア13692

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

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

naizawa

2020/10/22 04:43

回答ありがとうございます。egrep処理結果で検索キーワードが反転され表示されるのですが、記述を削除させる処理を入れるとすれば「|」処理で可能でしょうか?
naizawa

2020/10/22 06:30

本件、解決することができました。以降の参考にさせていただきます。
KojiDoi

2020/10/22 06:34

反転表示をやりたくないのなら、 egrep --color=never ... です。
naizawa

2020/10/22 08:07

反転表示系は手を出してなかったので、参考になります。これを機に活用していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問