У меня есть файл с одним столбцом с именами, которые повторяются по несколько раз каждый. Я хочу сжать каждый повтор в одно, сохраняя при этом любые другие повторения с тем же именем, которые не соседствуют с другими повторениями с тем же именем.
Например, я хочу повернуть левую сторону к правой стороне:
Golgb1 Golgb1
Golgb1 Akna
Golgb1 Spata20
Golgb1 Golgb1
Golgb1 Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna
Это то, что я использовал: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt
однако, этот метод держит только одного представителя слева (т.е. Golb1 и Akna не повторяются).
Есть ли способ сохранить уникальные имена для каждого блока, сохраняя имена, которые повторяются в нескольких несмежных блоках?
sort | uniq
sort -u
(:Awk
решение:Выход:
источник
Попробуйте это - сохранить предыдущую строку и сравнить с текущей строкой
Вы тоже пометили
uniq
- пробовали?источник
С помощью sed это можно сделать следующим образом:
Здесь мы имеем в шаблонном пространстве в любое время 2 строки. Когда сравнение между ними не удается, мы печатаем первый и режем его спереди, возвращаемся и добавляем следующую строку в пространство шаблона. Полоскание ... повтор
Используя Perl в режиме slurp, мы рассматриваем весь файл как одну длинную строку, к которой применяется регулярное выражение, что делает сравнение за вас.
источник
Вопрос о разрешении Ракеша Шармы.
Что делать, если у вас есть входной файл, такой как:
И вы хотите, чтобы выходной файл был:
Обратите внимание на отсутствие:
Я знаю, что команда, которую я хочу, похожа на ваше решение:
Невозможно изменить его правильно, чтобы распечатать оба столбца, и сортировать его можно только особым образом со значениями столбца 2. Какие-нибудь советы?
источник
sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D'
удалит последующие повторяющиеся элементы. Примечание: Для этого требуетсяGNU sed
. ДляPOSIX
поведения необходимо небольшое изменение.