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

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

  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); 
  • Что делает `join 'с точки зрения равноценности в SQL или операций в реляционной алгебре?
  • REGEX поиск и замена с помощью sed или другой команды
  • Как объединить первые две строки CSV столбец за столбцом?
  • найти строки, совпадающие с другим файлом, и сохранить их в отдельном файле
  • sed с несколькими командами, могу ли я использовать флаг w (write)?
  • Объединить несколько строк столбец за столбцом на основе столбца 1 - один и тот же файл?
  • Как обработать несколько строк столбца
  • Как переформатировать блоки зоны named.conf в одну строку?
  • Как удалить инверсные пары совпадений?
  • Поиск греческого из командной строки
  • grep'ping файлы для нескольких строк (не в одной строке)
  • Interesting Posts

    Что означает DISPLAY =: 0.0?

    Падение на git checkout при не найденных командах bash

    Как преобразовать поля фиксированной длины в файл в пространство с разделителями

    Почему «sudo su» в сценарии оболочки не запускает остальную часть скрипта как root?

    Каковы команды для применения изменений, внесенных в / etc / ssh / sshd_config?

    Разрешить группе su пользователю без пароля в Amazon Linux

    GNU ls длинный список без разрешения / бит режима

    шкала bc: Как избежать округления? (Рассчитайте небольшую биномиальную вероятность)

    scp, globbing и различные оболочки

    sed backreference: получить каждую строку и добавить ее к концу строки

    Вычисление видимой области частично скрытого окна

    Как вставить вывод нескольких команд

    Невозможно создать модуль Hello World (и NVIDIA и VirtualBox)

    Использование dd для копирования результатов MBR в таблицах разделов удваивает размер

    Сервер Ubuntu 16.04 – Получите полный доступ к FTP / var / www /

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