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

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

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

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

3回答

818閲覧

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

kakuko

総合スコア2

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2020/06/07 13:59

編集2020/06/07 14:26

前提・実現したいこと

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

試したこと

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

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

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

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

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

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

otn

2020/06/07 14:09

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

2020/06/07 14:27

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

2020/06/07 14:46

> ・複数の input file のデータを一度に調べるソースコードです(そのためのfor構文です)。 *.inputfileの中は提示されている行だけが入ってますか? 関係ない行も含まれている場合、その行は対象外にする処理が必要になります。
guest

回答3

0

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

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

投稿2020/06/07 23:46

takasima20

総合スコア7464

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

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

0

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

awk

1# test.awk 2 3BEGIN{ 4 FS="\t" 5} 6{ 7 a=$10 8 while(match(a, /(COG[0-9][0-9][0-9])/, res)){ 9 print FILENAME, $1, res[1] 10 a = substr(a, RSTART+1) 11 } 12}
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/07 16:02

編集2020/06/07 16:11
KojiDoi

総合スコア13692

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

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

kakuko

2020/06/20 05:11

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

0

ベストアンサー

若干仕様が分かってない部分があるのですがとりあえず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 14:28

hidezzz

総合スコア1248

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

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

kakuko

2020/06/07 14:39

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

2020/06/07 14:44

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

2020/06/07 15:13 編集

> ・タブ区切りの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'
kakuko

2020/06/20 05:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問