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