AWK / BASH: как удалить дубликаты строк из файла с известным диапазоном полей? - PullRequest
1 голос
/ 19 октября 2010

Мне было интересно, есть ли способ использовать bash / awk для удаления дублирующихся строк на основе известного диапазона полей.Например:

Easy Going                  USA:22 May 1926
Easy Going Gordon               USA:6 August 1925   
Easy Life                   USA:20 May 1944
Easy Listening                  USA:14 January 2002 
Easy Listening                  USA:10 October 2002 
Easy Listening                  USA:27 January 2004 
Easy Living                     USA:7 July 1937 
Easy Living                     USA:16 July 1937
Easy Living                     USA:4 September 2009

Я хотел бы удалить дубликаты заголовков.Название фильма всегда будет от $ 1 до $ (NF-3).В идеале я хотел бы придерживаться первого случая (самой ранней даты), но если это невозможно, это не имеет значения.

Спасибо,

Томек

Ответы [ 3 ]

2 голосов
/ 19 октября 2010
#!/bin/bash

awk 'BEGIN{
   m=split("January|February|March|April|May|June|July|August|September|October|November|December",d,"|")
   for(o=1;o<=m;o++){
      months[d[o]]=sprintf("%02d",o)
   }
}
{
   sub(/.*:/,"",$(NF-2))
   t=mktime($(NF)" "months[$(NF-1)]" "$(NF-2)" 0 0 0")
   time[t]=$(NF-2) FS $(NF-1) FS $(NF)
   $(NF-2)=$(NF-1)=$(NF)=""
   gsub(/ +$/,"")
   if (!($0 in array)){array[$0]=99999999999999}
   if ( t <= array[$0] ){ array[$0]=t }
}
END{
  for(i in array){ print "->",i,time[array[i]]  }
} ' file

выход

$ ./shell.sh
-> Easy Living 7 July 1937
-> Easy Going Gordon 6 August 1925
-> Easy Listening 14 January 2002
-> Easy Going 22 May 1926
-> Easy Life 20 May 1944
2 голосов
/ 19 октября 2010
awk '
    {
        line = $0
        $(NF-2) = $(NF-1) = $NF = ""
        if ( ! ($0 in movies)) 
            movies[$0] = line
    }
    END {
        for (m in movies) print movies[m] 
    }
' movies.txt 

Это не сохраняет первоначальный порядок строк.Возможно, вы захотите sort вывод.

0 голосов
/ 19 октября 2010

Это может быть быстрый ответ

sort -t':' -k1,1 -u your-file
...