2010-10-19 11 views
1

Je me demandais s'il y avait un moyen d'utiliser bash/awk pour supprimer les lignes dupliquées en fonction d'une plage de champs connue. Par exemple:AWK/BASH: Comment supprimer des lignes en double d'un fichier avec une plage de champs connue?

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 

Je souhaite supprimer les titres de déplacement en double. Le titre du film sera toujours de 1 $ à $ (NF-3). Idéalement, je voudrais rester avec la première occurrence (la première date), mais si ce n'est pas possible, cela n'a pas d'importance.

Merci,

Tomek

+0

Est-ce un onglet? – codaddict

Répondre

2
#!/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 

sortie

$ ./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 
+0

Comment préserverais-tu le pays? –

+0

utilisez une autre avec la date trouvée comme clé et le pays comme valeur. – ghostdog74

0

Cela pourrait être une réponse rapide

sort -t':' -k1,1 -u your-file 
+0

Pas vraiment. Vous faites du nom du pays 'USA' une partie du nom du film. – codaddict

+0

oui, j'ai dit que c'est une réponse rapide, et ne devrait pas être un gros problème: il ya des films de pays différents avec le même titre? possible mais pas probable. – enzotib

+0

Si ces données proviennent d'IMDB, ce sont les dates * release *. – codaddict

1
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 

Cela ne préserve pas la commande de ligne d'origine. Vous voudrez peut-être sort la sortie. Qu'est-ce qui sépare le titre du film de la date de sortie?

+0

Notez que cela ignore également la date. –