Сравнить строки в файле с общим последним столбцом, но другим в другом столбце

Как сравнить последовательные строки из текстового файла, где последний столбец должен быть одинаковым? И хотя бы одно значение во втором последнем столбце должно быть не соответствующим.

  1. Во-первых, столбец 6 следует сравнить в файле, если он совпадает
  2. Затем сравните столбец 4 для сопоставленных строк. В столбце 4 все значения не должны быть одинаковыми, по крайней мере одно должно быть другим. Здесь 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 

2 Solutions collect form web for “Сравнить строки в файле с общим последним столбцом, но другим в другом столбце”

Предполагая, что файл разделен табуляцией, вы можете использовать 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 

Это проходит через файл дважды: первый раз, чтобы посчитать, сколько значений $ 4 встречаются для каждого $ 6; второй раз, чтобы вывести запись, если есть более 1 $ 4 значения для этих $ 6.

Вероятно, это можно сделать за один проход, за счет сложности, использования памяти и, возможно, потери первоначального порядка.


Та же логика в 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 

Прочитайте файл построчно, сохраните строку в буфере, если последний столбец имеет то же значение, что и все остальные строки в буфере, в противном случае обработайте буфер и очистите его.

Обработка буфера означает попытку найти хотя бы одну пару последовательных строк, которые не разделяют значение 4-го столбца, и распечатать буфер в случае успеха.

Я сохранил точные строки в буфере вместе с отдельными столбцами для лучшего вывода и более легкого доступа к значениям.

 #!/usr/bin/perl use warnings; use strict; sub process { my (@rows) = @_; my $different; for my $i (1 .. $#rows) { $different = 1, last if $rows[ $i - 1 ][4] ne $rows[$i][4]; } print map "$_->[0]\n", @rows if $different; } my @buffer; while (<>) { chomp; my @columns = split; if (! @buffer || $buffer[0][-1] == $columns[-1]) { push @buffer, [$_, @columns]; } else { process(@buffer); @buffer = [$_, split]; } } process(@buffer); 
  • Как записать в новый файл, если есть вхождения в другом?
  • найти строки, совпадающие с другим файлом, и сохранить их в отдельном файле
  • grep'ping файлы для нескольких строк (не в одной строке)
  • Как объединить первые две строки CSV столбец за столбцом?
  • awk: разделить столбец, распечатать левую часть разделителя и вставить в середине csv
  • Как заполнить пробелы в первом столбце значением, полученным из предыдущей непустой строки?
  • sed заменяет соответствующую строку, которая не начинается с #
  • Разобрать вывод с динамической шириной столбца и пустыми полями
  • Пробуждение строки, сопровождаемое '\ n'
  • как напечатать только часть каждой строки, которая помечается определенным символом
  • Поиск греческого из командной строки
  • Interesting Posts

    Top не показывает некоторые процессы в зависимости от пользователя

    Есть ли способ сделать быстрые снимки QEMU без использования libvirt?

    / dev / sda2 отправлено 49710 дней без проверки, проверьте принудительный

    Как проверить, установлена ​​ли моя графическая карта на Linux?

    В чем разница между вероятными и маловероятными вызовами в ядре?

    Программа сжатия, показывающая коэффициент сжатия в реальном времени

    Что такое команда erepc? Это вредоносное ПО?

    emacs не позволит мне использовать другой цвет фона

    grep с большим количеством файлов, который содержит много строк?

    Вложенные циклы, если условия и фоновые задания в bash

    Порт открыт, но я не могу ssh к нему

    Есть ли конкретная причина, по которой iptables вернет код выхода из 3 (вместо 1?) При выполнении без достаточных привилегий?

    cURL <- функция

    Не было обнаружено ошибок при запуске новой установки chroot debian wheezy с xfce gui

    изменить имя пользователя учетной записи root

    Linux и Unix - лучшая ОС в мире.