удаление повторяющихся строк из файла / grep - PullRequest
3 голосов
/ 17 сентября 2009

Я хочу удалить все строки, где все вторые столбцы 05408736032 одинаковы

0009300 | 05408736032 | 89 | 01 | 001 | 0 | 0 | 0 | 1 | NNNNNNYNNNNNNNNN | ASDF | 0009367 | 05408736032 | 89 | 01 | 001 | 0 | 0 | 0 | 1 | NNNNNNYNNNNNNNNN | adff |

эти строки не являются последовательными. Это хорошо, чтобы удалить все строки. Мне не нужно держать одного из них рядом.

Извините, мой unix fu действительно слаб из-за неиспользования :).

Ответы [ 9 ]

8 голосов
/ 17 сентября 2009

Если все ваши входные данные отформатированы, как указано выше - то есть поля фиксированного размера - и порядок строк в выходных данных не имеет значения, sort --key=8,19 --unique должно сработать. Если порядок имеет значение, но повторяющиеся строки всегда последовательны, uniq -s 8 -w 11 будет работать. Если поля не имеют фиксированной ширины, но повторяющиеся строки всегда последовательны, скрипт Pax на awk будет работать. В самом общем случае мы, вероятно, смотрим на что-то слишком сложное для однострочника.

3 голосов
/ 17 сентября 2009

Предполагая, что они последовательны, и вы хотите удалить последующие, следующий скрипт awk сделает это:

awk -F'|' 'NR==1 {print;x=$2} NR>1 {if ($2 != x) {print;x=$2}}'

Работает, печатая первую строку и сохраняя второй столбец. Затем для последующих строк он пропускает те, в которых сохраненное значение и второй столбец совпадают (если они различаются, он печатает строку и обновляет сохраненное значение).

Если они не последовательны, я бы выбрал решение Perl, где вы поддерживаете ассоциативный массив для обнаружения и удаления дубликатов - я бы написал его, но моя трехлетняя дочь только что проснулась, сейчас полночь, и у нее есть простуда - увидимся завтра, если я переживу ночь: -)

2 голосов
/ 11 октября 2011

Это код, который используется для удаления повторяющихся слов в строке.

awk '{for (i=1; i<=NF; i++) {x=0; for(j=i-1; j>=1; j--) {if ($i == $j){x=1} } if( x != 1){printf ("%s ", $i) }}print ""}' sent
1 голос
/ 17 сентября 2009

Если столбцы не имеют фиксированной ширины, вы все равно можете использовать сортировку:

sort -t '|' --key=10,10 -g FILENAME
  1. Флаг -t установит разделитель.
  2. -g только для естественного числового упорядочения.
1 голос
/ 17 сентября 2009

Unix включает Python, поэтому следующие несколько строк могут быть именно тем, что вам нужно:

f=open('input.txt','rt')
d={}
for s in f.readlines():
  l=s.split('|')
  if l[2] not in d:
    print s
    d[l[2]]=True

Это будет работать без фиксированной длины, даже если идентичные значения не являются соседями.

0 голосов
/ 20 января 2010

Поместите строки в хеш, используя строку в качестве ключа и значения, затем выполните итерации по хешу (это должно работать практически на любом языке программирования, awk, perl и т. Д.)

0 голосов
/ 18 сентября 2009
awk -F"|" '!_[$2]++' file
0 голосов
/ 17 сентября 2009

Делает два прохода над входным файлом: 1) найти дубликаты значений, 2) удалить их

awk -F\| '
    {count[$2]++} 
    END {for (x in count) {if (count[x] > 1) {print x}}}
' input.txt >input.txt.dups

awk -F\| '
    NR==FNR {dup[$1]++; next}
    !($2 in dup) {print}
' input.txt.dups input.txt

Если вы используете bash, вы можете опустить временный файл: объединить в одну строку, используя подстановку процесса: (глубокий вдох)

awk -F\| 'NR==FNR {dup[$1]++; next} !($2 in dup) {print}' <(awk -F\| '{count[$2]++} END {for (x in count) {if (count[x] > 1) {print x}}}' input.txt) input.txt

(уф!)

0 голосов
/ 17 сентября 2009

этот awk будет печатать только те строки, где второй столбец не 05408736032

awk '{if($2!=05408736032}{print}' filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...