【问题标题】:Print unique lines, compare no more than N characters打印唯一行,比较不超过 N 个字符
【发布时间】:2013-05-01 20:56:38
【问题描述】:

使用uniq,您可以选择仅比较第一个N 字符

$ 猫 foo.txt 敏捷的棕色狐狸跳过了懒狗。 敏捷的棕色狐狸跳过了懒惰的猫。 敏捷的棕色狐狸跳过了懒惰的老鼠。 $ uniq -w 40 foo.txt 敏捷的棕色狐狸跳过了懒狗。

使用awk可以达到同样的效果吗?我读 this example

awk '!a[$0]++'

但它会比较整行。

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    awk 有substr() 函数:

    awk '!a[substr($0,1,40)]++'
    

    用你的例子:

    kent$  echo "The quick brown fox jumps over the lazy dog.
    The quick brown fox jumps over the lazy cat.
    The quick brown fox jumps over the lazy mouse."|awk '!a[substr($0,1,40)]++'
    The quick brown fox jumps over the lazy dog
    

    【讨论】:

    • P.S.我刚刚发现“狗”(在输出中)丢失之后的时间段。这是一个复制/粘贴错误。执行 awk 命令后,该点出现在输出中。
    【解决方案2】:

    使用FIELDWIDTHSFPAT 的两种选择:

    awk '!a[$1]++' FIELDWIDTHS=40
    
    awk '!a[$1]++' FPAT='.{40}'
    

    【讨论】:

    • 您可能应该声明这两个都是 gawk-only。不,我没有对任何人投反对票。
    • 旁注如何获得比正确答案更多的赞成票? 3 次投票...这些是 substr 解决方案的完全有效替代方案。
    • 有些人只是喜欢拒绝投票按钮。在这里,我会投赞成票以消除优势:-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2018-07-07
    相关资源
    最近更新 更多