Как объединить несколько текстовых файлов и эффективно удалить дубликаты?

если столбцы, которые вы имеете в виду и известны, разделены пробелом, вы можете сделать следующее:

sed -E 's/^(([^ ]* ){3})POS=.*;GINFO=/\1/' infile

Это ^(([^ ]* ){3})совпадение начинается с начала строки ^для чего-либо *кроме пробела [^ ]до первого увиденного пробела и повторяется максимально {3}раз; Круглые скобки делают это совпадение групповым соответствием с обратной ссылкой -на \1, которую позже мы возвращаем обратно в замещающую часть s/pattern/replace/.

Это (...)POS=.*;GINFO=также соответствует POS=, за которым следует что-либо от .*до ;GINFOи будет удалено из вывода.

Для приведенных ниже выборочных данных:

1 10241 POS=rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 POS=10241;VP=0x05;GINFO=DDX11L1:100287102;R5;ASP

Возвращает результат:

1 10241 POS=rs960927773 DDX11L1:100287102;R5;ASP
1 POS=10241 rs960927773 DDX11L1:100287102;R5;ASP
POS=1 10241 rs960927773 DDX11L1:100287102;R5;ASP

Версия POSIXly может быть:

sed 's/^\([^ ]* \)\([^ ]* \)\([^ ]* \)POS=.*;GINFO=/\1\2\3/' infile
0
06.04.2020, 09:45
1 ответ

просто используйте sort -u file[12].txt >output.txt. который сортирует ввод при удалении дубликатов.

убедитесь, что ваши файлы имеют формат новой строки типа Unix (LF\n)вместо формата новой строки Dos/Windows (CRLF\r\n); если нет , преобразуйте их командой tr -d $'\r' <filenameили dos2unix filename.

0
28.04.2021, 23:18

Теги

Похожие вопросы