3

私はこのようなテーブルを持っています:

symbol  refseq          seqname start           stop            strand
Susd4   NM_144796       chr1    184695027       184826500       +
Ptpn14  NM_008976       chr1    191552147       191700574       +
Cd34    NM_001111059    chr1    196765080       196787475       +
Gm5698  NM_001166637    chr1    31034088        31055753        -
Epha4   NM_007936       chr1    77363760        77511663        -
Sp110   NM_175397       chr1    87473474        87495392        -
Gbx2                    chr1    91824537        91827751        -
Kif1a                   chr1    94914855        94998430        -
Bcl2    NM_009741       chr1    108434770       108610879       -

そして、次の条件でデータを抽出したいと思います。

1)「refseq」列の値が欠落していない行

2)「start」列と「」列の値については、各行stopに1つの値のみを保持します。「」列strandの値が「」+の場合は、「」の値を取得しますstart。列" strand"の値が""-の場合、""の値を取りますstop

そして、これは期待されたものです:

Susd4   NM_144796   chr1    184695027   +
Ptpn14  NM_008976   chr1    191552147       +
Cd34    NM_001111059    chr1    196765080       +
Gm5698  NM_001166637    chr1        31055753    -
Epha4   NM_007936   chr1        77511663    -
Sp110   NM_175397   chr1        87495392    -
Bcl2    NM_009741   chr1        108610879   -
4

4 に答える 4

2

タブだけを主張するのではなく、空白とタブがフィールドを分離するように、入力区切り文字を変更せずに残したいと思うでしょう。つまり、6つのフィールドを持つ最初の(見出し行をスキップする)後のレコードが必要です。

awk 'NR > 1 && NF == 6 { if ($6 == "+") x = $4; else x = $5; print $1, $2, $3, x; }'

出力フォーマットをさらに制御したい場合は、OFSを使用するか、次を使用できますprintf

awk 'BEGIN { OFS = "\t" }
     NR > 1 && NF == 6 { if ($6 == "+") x = $4; else x = $5; print $1, $2, $3, x; }'

awk 'NR > 1 && NF == 6 { if ($6 == "+") x = $4; else x = $5;
                         printf "%-8s %-12s %s %9s\n", $1, $2, $3, x; }'

それを処理する他の方法があります、私は確信しています...

最初のスクリプトは以下を生成します:

Susd4 NM_144796 chr1 184695027
Ptpn14 NM_008976 chr1 191552147
Cd34 NM_001111059 chr1 196765080
Gm5698 NM_001166637 chr1 31055753
Epha4 NM_007936 chr1 77511663
Sp110 NM_175397 chr1 87495392
Bcl2 NM_009741 chr1 108610879

内容は正しいと思います。フォーマットは多くの方法で改善できます。最後のスクリプトは以下を生成します:

Susd4    NM_144796    chr1 184695027
Ptpn14   NM_008976    chr1 191552147
Cd34     NM_001111059 chr1 196765080
Gm5698   NM_001166637 chr1  31055753
Epha4    NM_007936    chr1  77511663
Sp110    NM_175397    chr1  87495392
Bcl2     NM_009741    chr1 108610879

必要に応じてフィールド幅を微調整できます。

于 2013-01-11T21:00:27.523 に答える
2

これはあなたのために働くかもしれません(GNU sed):

sed -r '1d;/(\S+\s+){5}\S+/!d;/\+$/s/\S+\s+//5;/-$/s/\S+\s+//4' file

編集:

  • 1dヘッダー行を削除します
  • /(\S+\s+){5}\S+/!d;行に6つのフィールドがない場合は、削除します
  • /\+$/s/\S+\s+//5+行が5番目のフィールドを削除して終了する場合
  • /-$/s/\S+\s+//4-行が4番目のフィールドを削除して終了する場合
于 2013-01-12T16:53:53.090 に答える
0

フィールドを含むテキストファイルを処理する場合、通常は、フィールドを含むテキストファイルの解析を支援するように設計されているためawkよりも優れています。sedawk

テーブルの列はどのように設定されていますか?タブで区切られていますか、それともスペースを使用して列を並べていますか?

これがタブ区切りのテーブルであるawk場合は、2番目のフィールドがnullかどうかを確認するために使用できます。

awk '
    {
        if ($2 == "") {
            print "Missing 'refseqence' in symbol " $1
        }
    ' $myfile

ファイルでスペースを使用してさまざまなフィールドを揃える場合でもawk、組み込みのsubstr`関数を使用して使用できます。

awk '
    {
        if (substr($0, 9, 12) ~ /^ *$/)
            print "Missing 'refsequence' in symbol " substr ($0, 1, 7)
        }
    }
' $myfile

ちなみに、私はここでそれを理解できるようにするための構文を示すためにかなり言葉遣いをしています。いくつかのショートカットを使用して、これらを1行にまとめることができます。

awk '$2 == "" {print "Missing refseqence in symbol " $1}' $myfile
awk 'substr($0, 9, 12) ~ /^  */ {print "Missing refsequnece in symbol " substr($0, 1, 7) }' $myfile 
于 2013-01-11T20:10:22.123 に答える
0

速くて汚い、plsはそれが機能するかどうかをチェックします:

awk -F'\t' 'NR>1&&$2{print $NF=="+"?$4:$5}' file

出力:

184695027
191552147
196765080
31055753
77511663
87495392
108610879

出力に他の値も必要な場合:

 awk 'BEGIN{FS=OFS="\t"}NR>1&&NF==6{print $1,$2,$3,$NF=="+"?$4:$5}' file 

出力:

Susd4   NM_144796       chr1    184695027
Ptpn14  NM_008976       chr1    191552147
Cd34    NM_001111059    chr1    196765080
Gm5698  NM_001166637    chr1    31055753
Epha4   NM_007936       chr1    77511663
Sp110   NM_175397       chr1    87495392
Bcl2    NM_009741       chr1    108610879

編集、OPの出力例に合わせてフォーマットを調整します。

awk 'BEGIN{FS=OFS="\t"}NR>1&&NF==6{$4=$NF=="+"?$4:" ";$5=$NF=="+"?" ":$5;print}' file

出力:

Susd4   NM_144796       chr1    184695027               +
Ptpn14  NM_008976       chr1    191552147               +
Cd34    NM_001111059    chr1    196765080               +
Gm5698  NM_001166637    chr1            31055753        -
Epha4   NM_007936       chr1            77511663        -
Sp110   NM_175397       chr1            87495392        -
Bcl2    NM_009741       chr1            108610879       -
于 2013-01-11T19:27:16.420 に答える