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

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

ただいまの
回答率

87.90%

sedコマンドで特定のキーワードを持つIDとそのキーワードを抽出できない。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 499

score 2

前提・実現したいこと

sedコマンドで特定のキーワードを持つデータIDとそのキーワードを抽出できない。

発生している問題・エラーメッセージ

inputファイル:データID(TEST_00004, _00005, _00006, _00007, _00008)のそれぞれに様々なデータがタブ区切りで含まれる。

TEST_00004    [10カラム目]06F4M@bactNOG,0EY64@cloNOG,0NSV1@firmNOG,0Y6CY@NOG
TEST_00005    [10カラム目]05CDF@bactNOG,0EP54@cloNOG,0ND91@firmNOG,COG0766@NOG
TEST_00006    [10カラム目]05C6Y@bactNOG,0D1MR@chloNOG,COG1004@NOG
TEST_00007    [10カラム目]05ESV@bactNOG,0EPU0@cloNOG,0NDX4@firmNOG,COG0472@NOG
TEST_00008    [10カラム目]00DGT@actNOG,08KGH@bactNOG,COG1316@NOG    

↓ 10カラム目に着目し、sed処理により、「COG???」(?は数字)のキーワードを持つデータIDとそのキーワード「だけ」を抽出したい。

(目的の抽出)
TEST_00005    COG0766
TEST_00006    COG1004
TEST_00007    COG0472
TEST_00008    COG1316

(実際のエラー:キーワードである「COG???」(?は数字)が他の文字情報とあわせて抽出される[TEST_00005, TEST_00006, TEST_00007]、あるいはそもそも抽出できない[TEST_00008])
TEST2_00005    05CDF@bactCOG0766
TEST3_00006    05C6Y@bactCOG1004
TEST4_00007    05ESV@bactCOG0472
TEST5_00008    00DGT@actNOG

以下のソースコードの「\」は「バックスラッシュ」です。Linux 初心者で、sedやawkもほぼ初めて使っている状況で、分かりくい内容で申し訳ございません。

該当のソースコード

for i in *.inputfile; do sed -e "s/[^\t]*,\(COG[0-9]*\)@NOG/\1/g" $i | awk -F"\t" '$10~/COG/ {print $1"\t"$10}' | sed -e "s/,.*//g" -e "s/@NOG//g" > $i.filt; done

試したこと

ソースコードを検討・確認しました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2020/06/07 23:09

    awkでは10カラム目しか見ていませんが、質問文中にその記述が無いです。
    どちらが正しいのですか?

    キャンセル

  • kakuko

    2020/06/07 23:27

    ご確認ありがとうございます。今回、10カラム目だけを見るコードです。説明不足で申し訳ございませんでした。

    キャンセル

  • hidezzz

    2020/06/07 23:46

    > ・複数の input file のデータを一度に調べるソースコードです(そのためのfor構文です)。

    *.inputfileの中は提示されている行だけが入ってますか?
    関係ない行も含まれている場合、その行は対象外にする処理が必要になります。

    キャンセル

回答 3

checkベストアンサー

+1

若干仕様が分かってない部分があるのですがとりあえずsedで書いてみました。
以下の前提条件を付けているのでそれが違っていれば直す必要があります。
タブ区切りの何カラム目にキーワードが入っているというのは決まってるのかもしれませんが前提条件には入れていません。
・左側のIDはアルファベットと数字と「_」だけで構成される。
・キーワード「COG」は各行に2回以上は出現しない。

$ cat inputfile.0
TEST_00004      580327.Tthe_2548        2.1e-07 60.5    bactNOG[38]     06F4M@bactNOG,0EY64@cloNOG,0NSV1@firmNOG,0Y6CY@NOG
TEST_00005      509191.AcelC_020100007381       3.4e-133        480.3   MURA    GO:0005575,GO:0005622,GO:0005623,GO:0005737,GO:0044424,GO:0044464       K00790  UAGCVT  bactNOG[38]     05CDF@bactNOG,0EP54@cloNOG,0ND91@firmNOG,COG0766@NOG
TEST_00006      926569.ANT_27250        4.4e-128        463.4   UGD     GO:0000271,GO:0003674,GO:0003824,GO:0003979,GO:0005975,GO:0005976,GO:0008150,GO:0008152,GO:0009058,GO:0009059,GO:0016051,GO:0016491,GO:0016614,GO:0016616,GO:0043170,GO:0044238,GO:0044710,GO:0044723,GO:0055114,GO:0071704,GO:1901576  K00012  UDPGD   bactNOG[38]     05C6Y@bactNOG,0D1MR@chloNOG,COG1004@NOG
TEST_00007      697303.Thewi_0160       8.9e-64 249.6   TAGO    GO:0000287,GO:0003674,GO:0003824,GO:0005488,GO:0005575,GO:0005623,GO:0005886,GO:0008150,GO:0008152,GO:0016020,GO:0016740,GO:0016772,GO:0016780,GO:0030145,GO:0043167,GO:0043169,GO:0044464,GO:0046872,GO:0046914,GO:0071944     K02851  bactNOG[38]     05ESV@bactNOG,0EPU0@cloNOG,0NDX4@firmNOG,COG0472@NOG
TEST_00008      471855.Shel_01960       2.8e-37 161.8   LYTR2   bactNOG[38]     00DGT@actNOG,08KGH@bactNOG,COG1316@NOG  NA|NA|NA
$ sed -n -e 's/^\([A-Za-z0-9_]*\).*\(COG[0-9][0-9]*\).*$/\1 \2/p' inputfile.0
TEST_00005 COG0766
TEST_00006 COG1004
TEST_00007 COG0472
TEST_00008 COG1316

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/07 23:39

    以下の前提条件を記載しておりませんでした。度々、説明不足で申し訳ございません。
    ・タブ区切りの10カラム目にキーワードが入っております。
    ・複数の input file のデータを一度に調べるソースコードです(そのためのfor構文です)。
    この場合は、どうなりますでしょうか?他にも説明が不足しておりましたら、コメントいただけますと幸いです。

    キャンセル

  • 2020/06/07 23:44

    では、追記・修正依頼に書きます。

    キャンセル

  • 2020/06/08 00:08 編集

    > ・タブ区切りの10カラム目にキーワードが入っております。

    この点だけの処理としては、回答の処理の前段にawkで1カラム目と10カラム目を取り出す処理を入れれば良い気がします。
    $ awk '{print $1 "\t" $10}' inputfile.0 | sed -n -e 's/^\([A-Za-z0-9_]*\).*\(COG[0-9][0-9]*\).*$/\1 \2/p'

    キャンセル

  • 2020/06/20 14:10

    ご返事が遅くなり申し訳ありませんでしたが、その後も試行錯誤し、上記のコマンドで対応できました。本当に、ありがとうございました。

    キャンセル

+1

どうせawkを使うなら、全部awkで片付けたほうが楽ではないですかね。

# test.awk

BEGIN{
  FS="\t"
}
{
  a=$10
  while(match(a, /(COG[0-9][0-9][0-9])/, res)){
      print FILENAME, $1, res[1]
     a = substr(a, RSTART+1)
  }
}
gawk -f test.awk *.inputfile

gawk(gnu awk)以外ではmatchは期待通りに動かないかもしれません。

追記

ちなみに、perlならもっと短く書けます。

perl -F"\t" -ane 'print "$ARGV $1\n" while ($F[9]=~/(COG\d{3})/g); *.inputfile'

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/20 14:11

    コメントをありがとうございました。その後、perl を試し、上記で動くことを確認しました。感謝いたします。

    キャンセル

+1

多少仕様に沿っていない部分があるかもしれませんが、小さなコマンドだけで書いてみました。
効率はよくないのでプログラミング系のコマンドを使う方がすっきり書けますけどね。

for i in *.inputfile
do
  echo $i
  grep 'COG[0-9][0-9][0-9]@NOG' $i | \
  cut -f 1,10 -d "\t" | \
  while read x y
  do
    echo $x"\t"`echo $y | tr ',@' "\n\n" | grep COG`
  done >$i.filt
done

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る