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

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

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

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

Linux

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

コマンド

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

Q&A

解決済

4回答

1885閲覧

Linux・Bashでのテキスト処理

justyum

総合スコア7

bash

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

Linux

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

コマンド

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

2グッド

2クリップ

投稿2020/03/13 10:23

編集2020/03/13 11:15

こんにちは。Linux初心者です。以前に使われていたLinuxのデバイスを整理しています。
主に、以下の2つのディレクトリ間でのデータのやり取りをしています。

/home/taro/data
/home/taro/scripts

~/data のディレクトリには以下の複数のファイルがあるのですが、欲しい古い情報は、list.txtに入っています。
taro_contact_2020.csv tomo_picture_2017.jpg miki_picture_2016.jpg taro_profile_2018.doc tomo_profile_2017.doc taro_profile_2019.doc list.txt

実際に、以下のコマンドを打つと10個のテキスト情報が表示されます。

bash

1cat list.txt

001 taro /data/jane_profile_2011.doc
002 tomo /data/kwood_profile_2010.doc
003 miki /data/pchow_profile_2009.doc
004 tomo /data/janez_profile_2008.doc
005 taro /data/jane_picture_2011.jpg
006 taro /data/kwood_picture2009.jpg
007 miki /data/pchow_picture_2010.jpg
008 taro /data/jane_contact.csv
009 tomo /data/kwood_contact.csv
010 miki /data/pchow_contact.csv

【やりたいこと】
① nano で findtaro.sh というファイルを /scripts のディレクトリ内に作って 前述のlist.txt から、
taro を含むファイル名だけを新しいファイル newfile.txt に挿入したい。 (newfile.txtは
/scriptsに置いています。)
② 念のためにヒットした結果が ~/data のディレクトリに重複して存在しないかテスト・チェックをしておきたい。

【自分でやってみたこと】
以下のコードを書いてみましたが、未熟でコードを完成させることができません。
色々試してみたのですが、newfile.txt に、"..data/list.txt"というテキストが挿入されてしまいます。

bash

1for names in ../data/list.txt; do 2 grep ' taro ' $names | cut -d ' ' -f3 3 for file in $names; do 4 if test -e ~/data/$file; then 5 echo "File already exists"; 6 else 7 echo "$file" >> newfile.txt; fi; done 8 9done

どのようなコードを書けば綺麗に処理できるのか、ご教授頂けると幸いです。

DrqYuto, s.k👍を押しています

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

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

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

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

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

guest

回答4

0

KojiDoiさんのアイデアを盗んで

bash

1cat ../data/list.txt | grep ' taro ' | cut -d ' ' -f3 | while read line ; do [ -f ..$line ] && echo file $line already exists || echo $line >>newfile.txt

はいかがでしょうか?

投稿2020/03/13 12:38

sage

総合スコア1216

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

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

justyum

2020/03/14 09:25

ご教授頂いた内容を自分で調べることで、新たな知識を得られることができました。 ありがとうございました。
guest

0

forの機能を勘違いされていると思います。

ちょっと質問文が不明瞭ですが、コードと照らし合わせると、
やりたいのはこういうことではないでしょうか。

awk '$2~/taro/{print $3}' | \ while read line ; do [ -f $line ] && echo $line exists || echo $line >> newfile.txt ; done

投稿2020/03/13 12:18

KojiDoi

総合スコア13669

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

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

justyum

2020/03/14 09:25

ご教授頂いた内容を自分で調べることで、新たな知識を得られることができました。 ありがとうございました。
guest

0

やろうとしている事?

  1. taro 行のファイルパスのみ抜き出す。
  2. ファイルパスにファイルが存在していれば何もしない。
  3. ファイルが無ければ、newlist.txt にファイルパスを書き出す。

実装

やり口が悪いが、ループ回すまでもないのでパイプでつなぐだけで出来そう。

bash

1grep -E '[[:blank:]]taro[[:blank:]]' list.txt | \ 2awk '{print $3}' | \ 3xargs ls 2>&1 | \ 4grep 'cannot access' | \ 5cut -d "'" -f 2 > newlist.txt

追伸

やりたいのはデータのコピーだと思われるので、実際には rsync で実現することなのではないでしょうか?

投稿2020/03/18 12:18

Oshiete-kun

総合スコア51

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

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

0

ベストアンサー

ちょっとやりたいことが不明瞭ですが、例えば001 taro /data/jane_profile_2011.docの行について、/home/taro/data/jane_profile_2011.docが存在するかチェックして、、、ということなら、

Bash

1while read num name file 2do 3 if [ "$name" = taro ] 4 then 5 if [ -e ~"$file" ] 6 then echo "File already exists" 7 else echo "$file" >> newfile.txt 8 fi 9 fi 10done < ~/data/list.txt

投稿2020/03/13 13:42

otn

総合スコア84423

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

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

justyum

2020/03/14 09:23

構文の書き方、初心者向けにわかりやすく教授頂きありがとうございました。大変、参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問