【问题标题】:Deduplicating by first field in awk按 awk 中的第一个字段进行重复数据删除
【发布时间】:2020-11-11 16:47:01
【问题描述】:

我正在寻找这个问题的最佳答案的修改版本:

extracting unique values between 2 sets/files

awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2

我如何通过对字段一而不是整行进行重复数据删除来完成同样的事情?

文件格式如下:

blah@domain.com,Elon,Tusk

我只想输出文件 2 中包含文件 1 独有的电子邮件的行。

理想的解决方案是允许多个文件,而不是只有 2 个,所有文件都与之前的文件重复,因此您可以这样做:

awk .... file1 file2 file3 file4 file5 file6

并以某种方式输出 6 个新文件,其中包含只有唯一第一个字段的行到它之前的所有其他文件

但是,如果这太复杂了,只处理 2 个文件也可以

【问题讨论】:

  • @kvantour 如果您不介意解释它是如何工作的,会很高兴吗?
  • 根据您的输入文件,您似乎有一系列逗号和空格作为分隔符,因此我们将其用作字段分隔符FS。我们现在只选择file1 中提到的第一个字段($1),所以我们可以这样做:awk 'BEGIN{FS="[ \t,]+"}{a[$1]; next}!($1 in a)' file1 file2。也不需要做a[$1]++a[$1] 就足够了,只需在数组a 中创建一个条目。没有必要计算遇到$1 的次数,因为您对它不感兴趣。 (注意这仅适用于一个文件)
  • @kvantour 空格是错误的,抱歉我已经修复了,文件中没有空格

标签: csv awk


【解决方案1】:

根据您提供的输入和您提出的请求,我们可以制作以下 awk 脚本:

awk 'BEGIN{FS=","}
    (FNR==1){close(f); f=FILENAME ".new"}
    !(a[$1]++) { print > f }' file1 file2 file3 file4 file5

这将创建 5 个名为 file[12345].new 的文件。这些文件中的每一个都将包含具有唯一第一列的行。请注意,file1.newfile1 显然是相同的(file1 中有重复项除外)

【讨论】:

  • 这太棒了,我会尽快尝试的
猜你喜欢
  • 1970-01-01
  • 2011-07-04
  • 2016-02-21
  • 2015-09-13
  • 1970-01-01
  • 2019-01-31
  • 2020-03-28
  • 2017-10-13
  • 2015-11-11
相关资源
最近更新 更多