【问题标题】:Remove duplicates from 2 filtered files with awk使用 awk 从 2 个过滤文件中删除重复项
【发布时间】:2015-12-26 17:17:23
【问题描述】:

我有 2 个具有 行数相同 的源文件(一个英文文件和一个意大利文文件),我执行 awk command 以删除 IT.txt 文件中包含更多行的所有行2个字以上

EN.txt
Santa Claus
Pigs don't fly
The son of the father
Elf
Santa Claus
Elf
Sabatons
Shoes

IT.txt
Babbo Natale
I maiali non volano
Il figlio del padre
Elfo
Babbo Natale
Elfo
Scarpe
Scarpe

所以基本上我有这种输出:

EN.txt
Santa Claus
Pigs don't fly
The son of the father
Elf
Santa Claus
Elf
Sabatons
Shoes

IT.txt
Babbo Natale
Elfo
Babbo Natale
Elfo
Scarpe
Scarpe

但同时,我想从 EN.txt 文件中删除相同的相关字符串。我想我可以处理行号(一会儿,然后我找到了一个更好的解决方案),而不是运行另一个 awk 命令以相同的方式删除 EN 文件中超过 2 个单词的字符串,因为翻译可能与源字符串不同(比如有更多单词)。所以我需要把工作重点放在 IT 文件上,EN 文件必须受到我启动的命令的影响。因此,我过滤后的输出一定是这样的:

EN.txt
Santa Claus
Elf
Santa Claus
Elf
Sabatons
Shoes

IT.txt
Babbo Natale
Elfo
Babbo Natale
Elfo
Scarpe
Scarpe

这是我尝试过的命令(建议与上一个问题一起使用),它运行良好:awk 'NR==FNR{if(NF>3){a[NR]}else{a[NR]=1;print > "filtered_it.txt"}} NR!=FNR && a[FNR]{print > "filtered_en.txt"}' IT.txt EN.txt

但是现在我想在这个命令上添加额外的内容,比如删除重复项以获得这样的输出,但要小心那些可能在意大利语中具有相同翻译但它们各自的源字符串不同的行(像 SabatonsShoes 翻译成 Scarpe)。总之,我只需要同时(以某种方式)从两个文件中删除重复项,而不是从运行每个命令的单个文件中删除重复项。

EN.txt
Santa Claus
Elf
Sabatons
Shoes

IT.txt
Babbo Natale
Elfo
Scarpe
Scarpe

【问题讨论】:

  • 这些前导数字真的存在于您的输入和输出文件中吗?如果是,则编辑您的问题以说明这一点,如果不是,则编辑您的问题以删除它们。
  • 完成...只是为了理解;)
  • 在示例输入/输出文件中放置不存在的文本并不能提高我们的理解力!
  • 我没有看到有一个逻辑规则可以用来删除“猪不飞”、“父亲的儿子”等。你认为这可能吗?请编辑您的 Q 以指明“规则”。祝你好运。
  • 极不可能有人去查看其他问题来尝试拼凑您当前的需求。如果您真的希望人们帮助您,请编辑您当前的问题,使其具有一组明确的要求和示例输入/输出。

标签: linux bash awk


【解决方案1】:

您的规范非常混乱,但我认为这就是您想要的。此外,与其对两个文件进行操作,如果它们应该逐行匹配,那么首先开始这样做会更容易。

$ paste EN.txt IT.txt
          | awk -F'\t' '{n=split($1,_," ");
                         m=split($2,_," ")} 
 n<3 && m<3 && !a[$0]++ {print $1 > "f_EN.txt";
                         print $2 > "f_IT.txt"}' 

$ cat f_EN.txt 
Santa Claus
Elf
Sabatons
Shoes

$ cat f_IT.txt   
Babbo Natale
Elfo
Scarpe
Scarpe

ps。您要么相信时间旅行是可能的,要么使用“明天”而不是“昨天”:)

【讨论】:

  • 只有一件事,为 EN.txt 和 IT.txt 文件设置字数,这是不正确的......因为与英文源字符串相比,意大利语的翻译可能不同且较长。 .. 所以我把命令改成:paste en.txt it.txt | awk -F'\t' '{n=split($1,_," "); m=split($2,_," ")} m&lt;3 &amp;&amp; !a[$0]++ {print $1 &gt; "f_EN.txt"; print $2 &gt; "f_IT.txt"}'我写的没问题?
  • 如果是这样,也删除相应的split(..);。请注意,根据输入顺序,$1 是英语,$2 是意大利语。
  • 我正在我的巨大语言文件上测试它,但我不知道我有一些小错误......就像有时它收集一个超过 3 个单词的字符串(它甚至不是一个完整的字符串,比如截断为 \n),也许我在使用粘贴命令时需要使用分隔符来避免这些......我会让你知道,如果你有一些想法,告诉我无论如何该命令与我写的例子,但现在我需要知道它是否适用于我的文件......
  • 好的,我这样解决了paste -d'\r' en.txt it.txt | awk -F'\r' '{n=split($1,_," "); m=split($2,_," ")} m&lt;3 &amp;&amp; !a[$0]++ {print $1 &gt; "f_EN.txt"; print $2 &gt; "f_IT.txt"}'你有更好的主意吗?
猜你喜欢
  • 2020-05-18
  • 1970-01-01
  • 2022-10-21
  • 2018-03-24
  • 2021-08-20
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多