一意の行を探す、特定の列を無視

一意の行を探す、特定の列を無視

私はファイルを探索し、安定していると予想されるフィールドで別の行を探し、異なることがわかっているフィールドの違いを無視できるようにしたいと思います。

2、5、6列を無視したいです。 1、3、4列の変更は報告する価値があります。

たとえば、

ここに画像の説明を入力してください。

最初の2行が変更を含むと報告されることは望ましくありませんが、2番目のペアは2行として報告されることを望みます。

ファイルがソートされました

sort -k1,1 -k3,3n -k4,4n

どんな提案がありますか? (質問形式が申し訳ありません。私はここに初めて来ました)

画像以外のデータの場合は、前後に行を追加してください。

NZ_CP020102     B4U62_RS00130   26852   28543   DNA polymerase III subunit gamma/tau    NCIB3610a
NZ_CP020102     TESTGENOMECL_26 26852   28543   DNA polymerase III subunit gamma/tau    TESTGENOME
NZ_CP020102     B4U62_RS00135   28567   28890   YbaB/EbfC family nucleoid-associated protein    NCIB3610a
NZ_CP020102     TESTGENOMECL_27 28567   28890   YbaB/EbfC family nucleoid-associated protein    TESTGENOME
NZ_CP020102     B4U62_RS00140   28905   29501   recombination protein RecR      NCIB3610a
NZ_CP020102     TESTGENOMECL_28 28905   29501   recombination protein RecR      TESTGENOME
NZ_CP020102     B4U62_RS00145   29519   29743   DUF2508 domain-containing protein       NCIB3610a
NZ_CP020102     TESTGENOMECL_29 29519   29743   DUF2508 domain-containing protein       TESTGENOME
NZ_CP020102     B4U62_RS00150   29810   30073   sigma-K factor-processing regulatory protein BofA       NCIB3610a
NZ_CP020102     TESTGENOMECL_30 29810   30073   sigma-K factor-processing regulatory protein BofA       TESTGENOME
NZ_CP020102     B4U62_RS00155   30317   31869   16S ribosomal RNA       NCIB3610a
NZ_CP020102     TESTGENOMECL_31 30317   31870   16S ribosomal RNA       TESTGENOME
NZ_CP020102     B4U62_RS00160   31969   32045   tRNA-Ile        NCIB3610a
NZ_CP020102     TESTGENOMECL_32 31969   32045   tRNA-Ile        TESTGENOME

列 4 の違いにより返される必要がある関連性のある唯一の他の行は、2 つの 16s 行です。

ほとんどの場合、行は対になっていますが、欠けている部分がある可能性があります。

NZ_CP020102     B4U62_RS00085   20006   20596   pyridoxal 5'-phosphate synthase glutaminase subunit PdxT        NCIB3610a
NZ_CP020102     TESTGENOMECL_17 20006   20596   pyridoxal 5'-phosphate synthase glutaminase subunit PdxT        TESTGENOME
NZ_CP020102     TESTGENOMECL_4554       20704   20925   hypothetical protein    TESTGENOME
NZ_CP020102     B4U62_RS00090   20918   22195   serine--tRNA ligase     NCIB3610a
NZ_CP020102     TESTGENOMECL_18 20918   22195   serine--tRNA ligase     TESTGENOME

この場合、ペアのないラインに興味があります。

デフォルトでは、列を抑制し、diffを実行し、diff出力に抑制された列が含まれるようにします。

ベストアンサー1

前提:これは実際のソリューションではなく概念の証明に近いもので、エレガントではないものと完全に醜いものの間のどこかにあります。

あなたが何を求めているのかわかりません。したがって、私の仮定は次のようになります。

  • 列サブセット(1、3、4)の一意の組み合わせを持つすべての行のみを選択しようとしています。他に興味がある場合(たとえば、2つの列の値が同じで、3番目の列の値が他のいくつかの行(2つ以上および2つ以下)にのみ興味がある場合)、質問を更新して明確にします。 。
  • 選択した行(6列すべて)の内容全体を印刷しようとしています。
  • 行のフィールドは、空白ではなくタブで区切られます。 (そうしないと、5番目の列に空白文字が含まれているように見えるため、少し奇妙になります。)メソッドはさまざまなフィールド区切り文字を受け入れる必要があります。

このコードでは(両方のエントリをyour_file実際のファイル名に置き換えます):

grep -f \
<(sort -k 1b,1b -k 3n,3n -k 4n,4n your_file |
  nl -n rz -w 9 |
  cut -f 1,2,4,5 |
  uniq -f 1 -c |
  grep '^[[:space:]]*1' |
  sed 's/\(^[[:space:]]*1[[:space:]]*\)\(.*\)/^\2/' |
  cut -f 1) \
<(sort -k 1b,1b -k 3n,3n -k 4n,4n your_file |
  nl -n rz -w 9) |
  sed 's/\(^[0-9]\+[[:space:]]*\)\(.*\)/\2/'
  • あなたのファイルは1、3、4列に並べられています。 (あなたの質問ですでにこれを行ったと言われているので、必要ないかもしれません。)
  • ソートされた行には番号が付けられています。固定の9文字の長さの先行番号はゼロで埋められます。
  • cut比較するツリーフィールドと最初のフィールド(行番号)のみを抽出します。
  • uniq最初のフィールド(行番号)を無視し、各行の先頭に数を追加して、各結果行の重複項目を計算します。
  • grep数が1の行のみが選択されます。
  • sed各結果行の先頭から数を削除します。
  • cut行番号の最初のフィールドのみを抽出します(この方法は、以前とsed試行を回避するよりも簡単ですcut -f 2)。
  • grep生成された行番号セットを使用して、番号付き行の初期セットをフィルタリングします。
  • 最後に、sedフィルタリングされた行セットから先行行番号が削除されます。

質問の14行を入力として使用すると、次のようになります。

NZ_CP020102     B4U62_RS00155   30317   31869   16S ribosomal RNA       NCIB3610a
NZ_CP020102     TESTGENOMECL_31 30317   31870   16S ribosomal RNA       TESTGENOME


注:以下を使用する必要があります。export LC_ALL=C並べ替えの問題の防止いくつかの文字。 GNUツールを使用して
Linuxでテストされました。bash

おすすめ記事