【问题标题】:Removing duplicates interpreted according to a pattern, fails删除根据模式解释的重复项失败
【发布时间】:2021-04-05 23:53:12
【问题描述】:

我对这些 awk-sed 脚本有一些问题

sed -E 's/(^[a-zA-Z]+)([[:space:]]+[a-zA-Z]+){0,1}.*/\1\2/' file1.txt | sort | uniq > zz.txt

或其他等价物(Windows GNU)

awk "match($0, /^[a-zA-Z]+( +[a-zA-Z]+)?/) {unq[substr($0, 1, RLENGTH)]} END {for (i in unq) print i}" file.txt > ZZ.txt

或者另一个对于 linux 是

sed -E 's/\s+\S+\s+[0-9]\S+$|[0-9].*//;s/(\S+\s+\S+)\s+\S+$/\1/
        H;x;s/((\n[^\n]*)(\n[^\n]*)*)\2$/\1/;x;$!d;x;s/.//' file

这些脚本有什么作用?获取这样的列表

Chi Allegati N.22021.htm
Casabella Marzo 2021.pdf
Casabella Febbraio 2021.pdf
Chi Allegati N.22021.pdf

使用 sed / awk 脚本后,您将获得此输出

Casabella
Chi Allegati

那么问题出在哪里?好的,现在考虑另一个列表

(Ebook ITA Fumetti) Genius 021 Bersaglio A Gog.cbr
(Ebook ITA Fumetti) Genius 022 Poker Di Delitti.cbr

Corna Vissute - La moglie del ladro.cbz
Corna vissute - Nuova serie 011 - Un'offerta irresistibile.cbr

Il piccolo sceriffo 20 (Dardo 1992-02) [c2c CapitanUltra].cbz
Il piccolo sceriffo 23 (Dardo 1992-05) [c2c dinofelix].cbr

Il mondo di Arkadi - Caza 01 - Gli occhi di Or'Fe (by aquila & Janesek).cbr
Il mondo di Arkadi - Caza 02 - Il grande esterno (by aquila & Janesek).cbr

Il segno di Zorro 21 (Edizioni del fanciullo 9-1976)(BYPico57).cbr
Il segno di Zorro Serie d'oro 07 - Il mistero della miniera (Edizioni del fanciullo 1975-10-01) [c2c Dinofelix].cbr

L'Uomo Mascherato 06 - Il ratto di diana (Nerbini 1938-09) [c2c Scaricatore17-Gitra].cbr
L'Uomo Mascherato 08 - Il ritorno di Diana (Nerbini 1940-10) [c2c Scaricatore17-Gitra].cbr

Le leggende di Batman 017 (Play Press 1997-12 c2c) By Samox.cbz
Le leggende di Batman 018 (Planeta 1998-01 c2c) [Play Press] By Samox.cbz

不幸的是,脚本不再运行良好。其实我很想得到这个输出(或者很接近的东西),但是不可能

    Corna Vissute
    Genius
    Il mondo di Arkadi
    Il piccolo sceriffo
    Il segno di Zorro
    Il segno di Zorro Serie d'oro
    L'Uomo Mascherato
    Le leggende di Batman

脚本背后的逻辑:

  1. 处理该行以仅包含所需的字段。
  2. 附加到保留空间。
  3. 切换到保留空间,删除重复行并切换回模式空间。
  4. 删除除最后一行以外的所有内容。
  5. 在最后一行,交换到保留空间,删除第一个换行符并打印结果。

编辑:添加另一个脚本处理不正确的示例

我有这份清单

A porte chiuse 054 - Come la prima notte (Ediperiodici 1985-11) [noc2c Charles].cbr
A porte chiuse 097 - Il demone nella bottiglia (Ediperiodici 1989-06) [c2c noedit Charless].cbr
A Porte Chiuse 138-139 - Una viziosa incallita.cbr
A porte chiuse Special 13 - Il primo amore-Il viziaccio [228pag] (Ediperiodici 1986-03) [c2c Charles-Edit Gitra].cbr
A Porte Chiuse Special 020 [Fumetti.Erotici](1400~).cbz

但我希望只有这个输出

A porte chiuse
A porte chiuse special

但是脚本返回这个

A Porte
A porte

编辑:另一个问题:我有

Il destino di Kakugo - vol 09 (MANGA ITA)(Scan & Edit by DDT)(DDT0580)(MQ jpg).cbr
Il mensile di Barbapap… N. 02 - [A.Mondadori] [1977-01] [ITA][c2c](no pagina centrale).cbz

但它返回我

il
Il destino di Kakugo
Il mensile di Barbapap

或者我有

Y L'Ultimo Uomo.-.Ragazze vol 07.-.(Magic Press)(c2c aquila).cbr
Y L'ultimo Uomo [08] Bambole Di Carta (Magic Press)(c2C Aquila).cbr
Yiu 01 - Inferno.cbr
Yiu 03 - Assassini (Scanlation, Ita, By Eleinad For Lc22Db).cbr

但它返回我

Y
Y L'ultimo Uomo
Yiu

但我期待

Il destino di Kakugo
Il mensile di Barbapap
Y L'ultimo Uomo
Yiu

【问题讨论】:

  • 第二个输入文件格式与第一个简单示例大不相同,没有明确的模式,除非我使用我的大脑而不是程序(例如,比较 (Ebook ITA Fumetti) Genius 输入行与 30_Giorni_di_Notte_ 输入行) .我们如何区分它们?在想要的输出中存在潜在问题:Il mondo di Arkadi 出现两次,Grandi eroi 不存在。一种解决方案是采用连续行之间的共同点,但即使这样也不能完全满足您的需求。
  • @LudovicKuty 是的,你是对的,我从我的示例列表中删除了 30_Giorni_di_NotteGrandi eroi。现在会不会容易些? Il mondo di Arkadi出现两次是因为我抄错了,不好意思
  • 上述解决方案取决于多个部分的融合——单个部分中的任何错误都会影响最终解决方案。从上面的 cmets 中,识别可以匹配重复的每一行的元素是最终解决方案所固有的。一旦解决方案的这一部分是正确的,其余的将随之而来。再看看列表的第一项。

标签: awk sed


【解决方案1】:

我上次回答中修改后的awk 脚本应该适合你:

awk '{sub(/^\([^)]+\) */, "")} match($0, /^[a-zA-Z][a-zA-Z\047]*( +[a-zA-Z\047]+)*/) {s = substr($0, 1, RLENGTH); unq[tolower(s)]=s} END {for (i in unq) print unq[i]}' file.txt

Il segno di Zorro Serie d'oro
L'Uomo Mascherato
Il mondo di Arkadi
Il piccolo sceriffo
Le leggende di Batman
Corna vissute
Il segno di Zorro
Genius

更易读的版本:

awk '
{sub(/^\([^)]+\) */, "")}
match($0, /^[a-zA-Z][a-zA-Z\047]*( +[a-zA-Z\047]+)*/) {
   s = substr($0, 1, RLENGTH)
   unq[tolower(s)] = s
}
END {
   for (i in unq)
      print unq[i]
}' file.txt

【讨论】:

  • 是的,谢谢,非常好,但除了一件事,请看这里:pastebin.com/uiwLXUSp - 如果我有Il destino di Kakugo - vol 09 (MA...Il mensile di Barbapap… N. 02 - [A.,它会返回给我ilIl destino di KakugoIl mensile di Barbapap。但我不需要在列表中也有il
【解决方案2】:

这是一个 sed 替代方案:

sed -E 's/(^[^0-9\-\.\[\…\-]* ?).*/\1/' input | sort -u

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 2016-09-16
    • 2021-02-09
    • 2017-03-02
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多