LINUX.ORG.RU
ФорумAdmin

awk & uniq


0

1

Ребята, есть текстовый файл, вот такого формата:

7777,66666666,1,135,1,

7777,66666666,2,129,Y,

7777,66666666,3,129,Y,

7778,66666667,1,135,1,

7778,66666667,2,129,Y,

7778,66666667,3,129,Y,

7778,66666667,4,129,Y,

помогите, пожалуйста, удалить строки в которых идет дупликация в 4м поле (строки с 129 должны быть по одному разу). Желательно однострочным.....



Последнее исправление: visavis (всего исправлений: 2)

sort -t, -k4 -u
anonymous
()
awk -F, -v x=, 'x!=$4,x=$4'
anonymous
()
Ответ на: комментарий от anonymous

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

visavis
() автор топика
Ответ на: комментарий от visavis

3001,71000004,1,201,1,

3001,71000004,2,135,Y,

3001,71000004,3,122,Y,

3001,71000004,4,201,Y,

3001,71000004,5,135,Y,

3001,71000004,6,135,Y,

3001,71000004,7,135,Y,

в таком случае получаю два раза 135....есть варианты как это избежать?

visavis
() автор топика

Если входной текст отсортирован по полям слева направо, то

cat text.txt | sort -nu -k4 -t "," | sort > out.txt
Первый sort убирает дубли по полю 4, второй возвращает предполагаемый первоначальный порядок тому, что осталось. А awk тут будет не в тему избыточен.

blexey ★★★★★
()
Ответ на: комментарий от blexey

для проверки того что sort делает дописывай к нему --debug. первый ответ в теме той же ошибкой страдает.

правильный ключ для четвертого поля -k4,4.

А awk тут будет не в тему избыточен.

а как sort строки сортирует? совсем не использует память?

anonymous
()
Ответ на: комментарий от anonymous

а как sort строки сортирует? совсем не использует память?

Использует (как и awk), но при этом не тянет за собой блэкджек и шл целый язык туда, где он не нужен.

blexey ★★★★★
()
Ответ на: комментарий от anonymous

спасибо, работает для этого

3001,71000004,1,201,1,

3001,71000004,2,135,Y,

3001,71000004,3,122,Y,

3001,71000004,4,201,Y,

3001,71000004,5,135,Y,

3001,71000004,6,135,Y,

3001,71000004,7,135,Y,

в таком случае получаю два раза 135....есть варианты как это избежать?

но подскажите еще как исключить из данной сортировки если значение 3го столбца равно 1, т.е. проверка дупликаций только если значение 3го столбца =>2?

visavis
() автор топика
Ответ на: комментарий от blexey

Использует (как и awk)

Не как awk. sort держит все строки (и полностью всю строку), awk создает hash по одному полю. При большом входном файле awk отработает значительно быстрее

sdio ★★★★★
()
Ответ на: комментарий от visavis

в таком случае получаю два раза 135

врешь ведь

sdio ★★★★★
()
Ответ на: комментарий от visavis

т.е. проверка дупликаций только если значение 3го столбца =>2?

&& $3>1

sdio ★★★★★
()
Ответ на: комментарий от visavis
+ cat run.sh
#!/bin/bash -x

cat run.sh

awk -F, '$3>1&&!x[$4]++' <<EOF
3001,71000004,1,201,1,
3001,71000004,2,135,Y,
3001,71000004,3,122,Y,
3001,71000004,4,201,Y,
3001,71000004,5,135,Y,
3001,71000004,6,135,Y,
3001,71000004,7,135,Y,
EOF
+ awk -F, '$3>1&&!x[$4]++'
3001,71000004,2,135,Y,
3001,71000004,3,122,Y,
3001,71000004,4,201,Y, 
anonymous
()
Ответ на: комментарий от visavis
awk -F, '!x[$4]++||$3==1'

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.