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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

解決済

3回答

2112閲覧

【Mac】ターミナルのコマンドを使って複数のディレクトリ下にある.csvファイルを編集したい。

testyoutatsu

総合スコア29

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

0グッド

1クリップ

投稿2018/08/16 08:39

編集2018/08/16 13:31

前提・実現したいこと

複数のディレクトリ下にある.csvファイルの「00:00」または「59:00」を含まない行を一括で削除したいです。(指摘いただきました。「00:00」も「59:00」も含まない行を一括削除したい。です。)
ディレクトリの構成は以下の通りです。

cdで2018ディレクトリに移動し、Jan下の0101.csvやFeb下の0201.csvのある行を削除できたらなと思っています。

file | |-2017 | | | |-Jan | |-0101.csv |-2018 | |-Jan | |-0101.csv |-Feb | |-0201.csv |-Mar   |-0301.csv

試したこと

以前、.csvファイルの一行目を削除した時は以下のようなコマンドを使いました。
しかしこのコマンドではcdで移動したディレクトリにあるファイルしか削除できませんでした。

find . -name '*.csv' -exec sed -i.bak '1d' {} \;

###編集したい.csvファイル(,でセルが区切られている)

csv

12017/02/28 07:00:00,100,200,300,400 22017/02/28 07:10:00,100,200,300,400 32017/02/28 07:20:00,100,200,300,400 4. 5. 6. 7

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

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

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

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

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

guest

回答3

0

ベストアンサー

このような方法はどうでしょうか? macで行うと[]と or(|) がうまく処理できずラベルを使用

bash

1find ./file/2018 -name "*.csv" -exec sed -i.bak -e '/\:00\:00/b' -e '/\:59\:00/b' -e d {} \;

検討した処理概要

  1. ./file/2018ディレクトリ以下で *.csv のファイルを探す
  2. *.csv.bak でバックアップを取る
  3. *.csv から :00:00 と :59:00 以外の行を削除(00:00:01も削除と考えました)

元データ

csv

12017/02/28 00:00:00,100,200,300,400 22017/02/28 00:00:01,100,200,300,400 32017/02/28 00:00:02,100,200,300,400 42017/02/28 07:10:00,100,200,300,400 52017/02/28 07:10:00,100,200,300,400 62017/02/28 07:20:00,100,200,300,400 72017/02/28 07:20:00,100,200,300,400 82017/02/28 07:10:00,100,200,300,400 92017/02/28 07:10:00,100,200,300,400 102017/02/28 00:10:00,100,200,300,400 112017/02/28 07:00:00,100,200,300,400 122017/02/28 07:59:00,100,200,300,400

処理後

csv

12017/02/28 00:00:00,100,200,300,400 22017/02/28 07:00:00,100,200,300,400 32017/02/28 07:59:00,100,200,300,400

投稿2018/08/17 06:19

編集2018/08/17 08:40
kuni-n

総合スコア112

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

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

testyoutatsu

2018/08/17 07:12

回答ありがとうございます。やはりmacでは[]と or(|)は使えないのですか。 00:00:01も削除したいと思っています。回答にある処理が実現したい処理です。教えていただいたコマンドを実行したところ「>」と表示され処理されません。知識不足で申し訳ないのですがこのコマンドを実行する以外に何か手順を踏むのでしょうか?
kuni-n

2018/08/17 08:41

> 教えていただいたコマンドを実行したところ「>」と表示され処理されません。 シングルクォーテーションが一部全角になってたので、回答のところで修正しました
testyoutatsu

2018/08/17 11:10

コピペだけで済ましてしまい見落としてしまいました。訂正ありがとうございます。 無事、期待通りの処理を行うことができました。ありがとうございました。
guest

0

日本語間違えてませんか?おそらく、「「00:00」も「59:00」も含まない行を一括で削除」で、
「「00:00」または「59:00」を含む行だけ残す」という事じゃ無いかと思います。

Bash

1find /file/2018 -name '*.csv' -exec sed -i.bak -n '/00:00\|59:00/p' {} \;

#追記
MacOSのsedだと、\|で「または」とならないようなので、

Bash

1find /file/2018 -name '*.csv' -exec sed -i.bak -n -e '/:00:00/p' -e '/:59:00/p' {} \;

と分けて。
もしくは、BSD準拠であれば、-E(拡張正規表現オプション)を使って、

Bash

1find /file/2018 -name '*.csv' -exec sed -i.bak -E -n '/00:00|59:00/p' {} \;

投稿2018/08/16 13:20

編集2018/08/17 09:09
otn

総合スコア84421

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

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

testyoutatsu

2018/08/16 14:26 編集

回答ありがとうございます。ご指摘いただいた通りで日本語が変でした。 早速コマンドを実行してみたのですが、全行削除されてしまい空ファイルになりました。1Aが「2017/02/28 07:00:00」なのでこの行を残す(○Aが「2017/02/28 10:59:00」の行も残す)といった具合にしたいのですが、回答していただけると幸いです。
otn

2018/08/16 23:46

sed -i.bak -n '/00:00\|59:00/p' の / / の中に、残したい行の文字列を書きます。 「または」で複数ある場合は、\| で区切ります。 上では、「00:00 という文字列を含むまたは 59:00 という文字列を含む行だけ残す」という意味です。
testyoutatsu

2018/08/17 00:37

なるほど、コマンドの意味は理解できました。しかし空ファイルになる理由はなんでしょうか?
otn

2018/08/17 00:50

指定が間違っているんでしょう。
testyoutatsu

2018/08/17 06:16 編集

コマンド不慣れなもので間違いがわかりませんでした。cdで2018またはJanに移動し、find . -name '*.csv' -exec sed -i.bak -n '/00:00\|59:00/p' {} \;を実行。これでからファイルになってしまいます。 全ての行が削除されたと考えると「2017/02/28 07:00:00」に「00:00」が含まれていないと判定されてしまっているのでしょうか?参考になるか分かりませんが「2017/02/28 07:00:00」の書式設定はユーザー指定で「yyyy/m/d h:mm」です。 追記: sed -i.bak -n '/113/p'を実行したところ113を含む行以外を一括削除できました。
otn

2018/08/17 08:03

失礼しました。Macのsedだと、「または」の\| が効かないのかも知れませんね。 sed -i.bak -n -e '/:00:00/p' -e '/:59:00/p' {} \; としてみてください。
testyoutatsu

2018/08/17 11:20

ありがとうございます。追記していただいたコマンドを実行したところ期待通りの処理を行うことができました。ありがとうございました。
guest

0

findのドキュメントはご覧になりましたか?

ご提示いただいているコマンド例にある [find .]の.はカレント以下を探すということです。
find .. -name とすれば、親ディレクトリから探しますし、フルパスで指定すればそこから探します。
find /file/2018 -name '*.csv' -print
とすると、/file/2018以下の拡張子にcsvを持つファイルがリストアップされます。
ですので、ご提示いただいたコマンドでも、/file/2018にcdした後で実行すれば、Janyや、Feb、Marの下にあるcsvに対して、sed -i.bak '1d' を実行しようとするでしょう。

また、「00:00」または「59:00」を含まない行削除を実現する場合は、以下で良かったかと思います。(試してはいない)

sed -i.bak -e '/^[00:00|59:00]/d'

投稿2018/08/16 10:04

t_obara

総合スコア5488

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

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

testyoutatsu

2018/08/16 11:37

回答ありがとうございます。無事、対象を一括でsed -i.bak '1d'を実行することができました。 find /user/…/file/2018 -name '*.csv' -exec sed -i.bak -e '/^[00:00|59:00]/d' {} \; こちらを試してみましたが、全てのファイルに対して0101.csv: No such file or directory のエラーが出てしまいます。こちらの原因はわかりますでしょうか?ディレクトリは存在しているはずなのですが、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問