最後の列が同じである必要があるテキストファイルの連続した行を比較するには?そして、2番目の列の1つ以上の値が一致してはいけません。
- 一致するものがある場合は、まずファイルの列6を比較してください。
- 次に、列4で一致する行を比較します。列4のすべての値は同じではなく、少なくとも1つの値は異なる必要があります。ここで、HSF1とHIF1ANはライン1、2、3に位置しています。
入力ファイル
chr10 102979 103832 HSF1 305
chr10 102979 103832 HIF1AN 1 305
chr10 102979 103832 HSF1 305
chr10 103124438 103124851 HSF1 471
chr10 103124438 103124851 EGLN1 2 471
chr10 103969896 103970503 HSF1 472
chr10 103969896 103970503 HSF1 472
chr10 39135037 39142175 HSF1 335
chr10 4191461 4191936 HSF1 309
chr10 4191461 4191936 HSF1 309
chr10 42423355 42424014 HSF1 336
結果ファイル
chr10 102979 103832 HSF1 305
chr10 102979 103832 HIF1AN 1 305
chr10 102979 103832 HSF1 305
chr10 103124438 103124851 HSF1 471
chr10 103124438 103124851 EGLN1 2 471
ベストアンサー1
タブ区切りファイルを想定すると、GNU awkを使用できます。
gawk -F'\t' 'NR == FNR {count[$6][$4]++; next} length(count[$6]) > 1' file file
chr10 102979 103832 HSF1 305
chr10 102979 103832 HIF1AN 1 305
chr10 102979 103832 HSF1 305
chr10 103124438 103124851 HSF1 471
chr10 103124438 103124851 EGLN1 2 471
これはファイルを2回通過します。 1 つ目は、各 $6 に何個の $4 値が発生するかを計算し、2 番目は $6 に複数の $4 値がある場合にレコードを出力します。
単一パスで行うことも可能ですが、複雑さ、メモリ使用量、元の順序が失われる可能性があります。
Perlの同じ論理
perl -Mautodie -e '
open $f, "<", shift;
while (<$f>) {
@F = split /\t/;
$c{ $F[5] }{ $F[3] }++;
}
# re-process the file
seek $f, 0, 0;
while (<$f>) {
@F = split /\t/;
print if scalar keys %{ $c{$F[5]} } > 1;
}
' file