【问题标题】:Extracting unique values between 2 files with awk使用 awk 提取 2 个文件之间的唯一值
【发布时间】:2019-12-29 17:23:09
【问题描述】:

比较 2 个文件时,我需要获取 uniq 行。这些文件包含字段分隔符“:”,在比较字符串时应将其视为行尾。

file1 包含这些行

apple:tasty
apple:red
orange:nice
kiwi:awesome
kiwi:expensive
banana:big
grape:green
orange:oval
banana:long

file2 包含这些行

orange:nice
banana:long

输出文件应该是(2次橙色和2次香蕉删除)

apple:tasty
apple:red
kiwi:awesome
kiwi:expensive
grape:green

所以应该比较 : 之前的唯一字符串

是否可以在 1 个命令中完成此任务?

我尝试以这种方式完成任务,但字段分隔符在这种情况下不起作用。

awk -F: 'FNR==NR {a[$0]++; next} !a[$0]' file1 file2 > outputfile

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    你基本上已经有了,但是当你只想处理第一个字段,即$1 时,$0 指的是整行。

    您还需要注意输入文件的顺序。要使用 file2 中的值来决定要包含 file1 中的哪些行,请先处理 file2:

    $ awk -F: 'FNR==NR {a[$1]++; next} !a[$1]' file2 file1
    apple:tasty
    apple:red
    kiwi:awesome
    kiwi:expensive
    grape:green
    

    【讨论】:

    【解决方案2】:

    一条评论:awk 对数组非常无效。在有大文件的现实生活中,最好使用类似的东西:

    comm -3 <(cut -d : -f 1 f1 | sort -u) <(cut -d : -f 1 f2 | sort -u) | grep -h -f /dev/stdin f1 f2
    

    【讨论】:

    • 究竟是什么问题可能导致 awk 在大文件上使用?使其按预期工作的文件大小限制是多少?
    • 首先,它非常慢,因为 awk 按顺序搜索数组。其次,它将所有数组保存在内存中。很难(不是说不可能)说出限制,因为它取决于您的硬件。无论如何,如果您的文件不是数百兆或更多,您可能没问题。
    • @EranBen-Natan,awk 的关联数组被实现为具有恒定时间查找的哈希表;数组不是按顺序搜索的。关于你的第二点,我完全同意 --- 整个数组必须适合内存,这对于庞大的数据集可能是个问题。
    • 谢谢@jas,这对我来说是个新闻!
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多