Сравните каждую вторую строку, напечатайте строку после, но удалите дубликаты - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть файл в формате:

id-of-item

description of item

id-of-item

description of item

id-of-item

description of item

id-of-item

description of item

id-of-item

description of item

(только одна строка между ними, здесь только большие пробелы)

Мне нужно сравнить описания предметов и, если они совпадают, удалить это описание, но сохранить идентификатор (мне нужно создать таблицу, которая ссылается на идентификаторы в виде групп)

Понятия не имею, как это сделать, я пробовал пару awk с NR% 2, uniq и т. Д., Но, очевидно, все они соответствуют только одному, а не другому = /

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Это может быть близко.Правило awk: поместите все, что хотите, чтобы убить дублирование, в индекс массива:

BEGIN {title = ""}
NF == 0 { print; next;}
title == "" {
    title = $0;
    print; next;
}
{
    if (value[$0] == "" ) print;
    value[$0] = $0;
    title = ""
}

Почувствуйте мощь ассоциативного массива.

0 голосов
/ 02 декабря 2011

Будет ли это работать?

awk 'NF' file | sed '{N;s/\n/:/g}' | 
awk -F":" -v OFS="\n\n" -v ORS="\n\n"  '{b[$2]++} {if (b[$2]>1) print $1; else print $1,$2}'

Ваш файл:

[jaypal:~/Temp] cat file
id-of-item31

description of item4 <--- Duplicate description

id-of-item22

description of item4 <--- Duplicate description

id-of-item34

description of item1 <--- Duplicate description

id-of-item21

description of item3

id-of-item11

description of item1 <--- Duplicate description

Исполнение:

[jaypal:~/Temp] awk 'NF' file | sed '{N;s/\n/:/g}' | 
awk -F":" -v OFS="\n\n" -v ORS="\n\n"  '{b[$2]++} {if (b[$2]>1) print $1; else print $1,$2}'

id-of-item31

description of item4

id-of-item22

id-of-item34

description of item1

id-of-item21

description of item3

id-of-item11
0 голосов
/ 02 декабря 2011

Я собираюсь сделать два упрощающих предположения:

  1. Описания - только одна строка.
  2. Вы можете идентифицировать символ, который не появляется в описаниях или идентификаторах. Я буду использовать вкладку для этого персонажа.

Ни одно из предположений не является очень сильным, поэтому при необходимости не составит труда адаптировать следующее.

С этими допущениями я приведу пример данных с printf "1\n\nitem 1\n\n2\n\nitem 2\n\n3\n\nitem 2\n\n4\n\nitem 1\n". Это выглядит так:

1

item 1

2

item 2

3

item 2

4

item 1

Для обработки этих данных я:

  1. Избавьтесь от пустых строк
  2. Объединение последовательных строк, разделяющих идентификатор и описание вкладкой
  3. Сортировать новые строки по полю описания
  4. Форматирование отсортированных строк в таблицу

Вот конвейер, который это делает:

grep -v '^[[:space:]]*$' |        
  awk 'NR%2 { printf("%s\t", $0) } !(NR%2)' | 
    sort -k2 | 
      awk -F"\t" 'desc != $2 { printf("-----\n%s\n", $2); desc = $2} { print $1 }'

Передайте образец данных через него, и вы получите

-----
item 1
1
4
-----
item 2
2
3
0 голосов
/ 02 декабря 2011

Это может помочь вам (?):

# cat input.txt
id-of-item0
id-of-item0 description of item0
id-of-item1
id-of-item1 description of item1
id-of-item0
id-of-item0 description of item0
id-of-item3
id-of-item3 description of item3
id-of-item4
id-of-item4 description of item4
# sed 'N;s/\n/!!!/' input.txt | sort -u | sed 's/!!!/\n/'
id-of-item0
id-of-item0 description of item0
id-of-item1
id-of-item1 description of item1
id-of-item3
id-of-item3 description of item3
id-of-item4
id-of-item4 description of item4

Если вы хотите удалить описание:

# sed 'N;s/\n/!!!/' input.txt | sort -u | sed 's/!!!.*//'
id-of-item0
id-of-item1
id-of-item3
id-of-item4

Пояснение:

Читайте input.txt 2 строки одновременно, заменяя новую строку \n на разделитель (здесь это !!!). Сортировка и удаление дубликатов. Замените разделитель !!! новой строкой \n. Или вообще удалите описание.

EDIT:

Это может сработать для вас (?):

sed '/^$/d' input_file |   # remove empty lines
sed -n 'h;n;G;s/\n/\t/p' | # join id with description and swap tab separating
sort |                     # sort descriptions
sed ':a;N;s/^\(\([^\t]*\)\t[^\n]*\)\n\2/\1/;ta;P;D' | # build index tab separated
sed 's/\t/\n/g'            # translate tabs to newlines
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...