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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

コマンド

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

906閲覧

テキストファイルの違いの数を出力させたい

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

コマンド

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/05/24 10:28

編集2021/05/24 12:59

テキストファイル1に含まれる単語のうち、テキストファイル2(テキストファイル1と行数が異なり、既にソートされている)に含まれないものの数を求めたいです。

追記:
パイプを用いて1行でする方法はありませんか?

cat テキストファイル1 | tr ' ' '¥n' | sort -f | uniq -i | diff テキストファイル1 テキストファイル2 | wc -l

自分は上のように書いてしまったのですが、これだと行の比較になってしまいますよね?
テキストファイル2はテキストファイル1の単語数よりもかなり多いです

なにか良い方法があれば教えていただきたいです

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

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

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

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

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

ppaul

2021/05/24 10:57

テキストファイル2がoneだけで、テキストファイル1がtwo one twoの時は二個と答えて欲しいのですか、それとも1個と答えて欲しいのですか。
takasima20

2021/05/24 11:14 編集

テキストファイル2 は 1単語/1行で重複なしなのかな?
退会済みユーザー

退会済みユーザー

2021/05/24 11:23

>テキストファイル2がoneだけで、テキストファイル1がtwo one twoの時は二個と答えて欲しいのですか、それとも1個と答えて欲しいのですか。 これについては 1個と答えて欲しいです。 以下のようなコマンドを実行後って感じです cat テキストファイル1 | sort | uniq
退会済みユーザー

退会済みユーザー

2021/05/24 11:24

>テキストファイル2 は 1単語/1行で重複なしなのかな? これについては 既にsortとuniq(大文字小文字区別しない)ということを行っているため、重複はないです
guest

回答2

0

ベストアンサー

sh

1cat テキストファイル1 | tr ' ' '¥n' | sort -f | uniq -i | sort > data1 2cat テキストファイル2 | tr ' ' '¥n' | sort -f | uniq -i | sort > data2 3 4comm -23 data1 data2 | wc -l

ソートを2回するのでテキストファイルが膨大だとちょっといやですが、
commがソート必須なので。

投稿2021/05/24 12:16

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2021/05/24 12:58

ありがとうございます! パイプを使って1行で表現する方法ってありますか?完全に自分の書き忘れなのですが、1行で表現する方法が思いつかずで…
otn

2021/05/24 13:30

Bash/Zshなら comm -23 <(cat ~ sort) <(cat~sort) | wc -l
退会済みユーザー

退会済みユーザー

2021/05/25 10:16

すみません、もしテキストファイル1が物語で「'」や「?」などの記号が含まれており、テキストファイル2は単語帳のような感じであるとすると、例えばテキストファイル1でapple? という文字列があり、テキストファイル2にはappleという文字列があった場合は異なるものと認識されてしまいますよね、? そうだとすると どのようにパイプ1行で表現することができるのでしょうか?
otn

2021/05/25 10:19

テキストファイル1を空白で区切るのでなく、英字の並びだけを抽出すれば良いのでは? grep -E -o '[A-Za-z]+'
退会済みユーザー

退会済みユーザー

2021/05/25 10:36

アポストロフィー、例えば「don't」とかはdonとtに別れてしまうような… 調べてもでてこなくて…
otn

2021/05/25 10:40 編集

そりゃそうです。 don't をどうしたいのでしょう? apple?も含め、何をどうしたいのか言語化できないと解決できません。
退会済みユーザー

退会済みユーザー

2021/05/25 10:47

don't(do notのような省略しているもの)はdonとtにわけず「don't」という単語、apple?は?(単語に関係ない記号)を消したいです
otn

2021/05/25 10:59

don'tとapple?については分かるのですが、一般化しないとコードになりません。 空白で区切った後で、単語の先頭末尾の「英字以外」を削除ですかね?単語途中の記号はノータッチで。
退会済みユーザー

退会済みユーザー

2021/05/25 11:12 編集

そのような感じです! 言い方が悪いせいで複雑になってしまいましたが、 「テキストファイル1(物語)に含まれる単語のうち、テキストファイル2に含まれないものの数をパイプ1行で求めよ」 という問題に取り組んでいます。 自分の考えたコマンドが余計な誤解を産んでしまっていたかもしれません、申し訳ありません。
otn

2021/05/25 11:15

「単語とはなんぞや?」を明確に定義しないと駄目ですね。 > 空白で区切った後で、単語の先頭末尾の「英字以外」を削除ですかね?単語途中の記号はノータッチで。 でいいなら、 ~~ | tr ' ' '\n' | sed 's/^[^A-Za-z]*//;s/[^A-Za-z]*$//' | ~~
退会済みユーザー

退会済みユーザー

2021/05/25 11:51

ありがとうございます! Bash/Zshでなければ1行は不可能ですかね?
otn

2021/05/25 11:58

何を使っているのですか?
退会済みユーザー

退会済みユーザー

2021/05/25 12:31

多分Bashです、教えていただいた通り、 comm -23 < cat テキストファイル1 | tr ' ' '¥n' | sed 's/^[^A-Za-z]*//;s/[^A-Za-z]*$//' | sort -f | uniq -i | sort >cat テキストファイル2 | tr ' ' '¥n' | sed 's/^[^A-Za-z]*//;s/[^A-Za-z]*$//' | sort -f | uniq -i | sort を実行したところ、 -bash: cat: そのようなファイルやディレクトリはありませんと出てきてしまいました
otn

2021/05/25 12:52

??? 括弧は???
退会済みユーザー

退会済みユーザー

2021/05/25 13:10

括弧を入れると -bash: 予期しないトークン `(' 周辺に構文エラーがあります というエラーになってしまいます
otn

2021/05/25 13:15

何らかのタイプミスですね。
otn

2021/05/25 13:19

あるいはシェルの設定かも。 cat <(date) で、日時が表示されますか?
otn

2021/05/25 13:20

あと不等号が1つ逆だし。
退会済みユーザー

退会済みユーザー

2021/05/25 13:39 編集

出力されます 単に打ち間違えてしまいました <( ではなく、 < ( としていたためエラー出力がされてしまったようです ありがとうございました
guest

0

たぶん動くと思うけど処理時間かかりそうな…
高級なスクリプト言語あたりを使う方が正解かも!?

bash

1n=0 2cat テキストファイル1 | tr ' ' '\n' | sort -f | uniq -i | \ 3while read s 4do 5 grep -i $s テキストファイル2 >/dev/null 6 if [ $? -eq 1 ] 7 then 8 let n++ 9 fi 10done 11 12echo $n

投稿2021/05/24 11:55

編集2021/05/24 20:31
takasima20

総合スコア7462

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

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

退会済みユーザー

退会済みユーザー

2021/05/25 10:53 編集

ありがとうございます! 試してみたのですが、次はn=0となってしまいました… 自分で考えてみてもこのコマンドで上手くいかない理由がわからないです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問