查找特定数字并对其进行排序

查找特定数字并对其进行排序

在整个文件中查找特定单词(在本例中为数字),对其进行排序,如果只出现一次则将其删除。

输入:

1. I love my country 1234
2. I love Newyork 5678
3. I love my city 1234
4. I love my pet 1111
5. I love my dog 2222
6. I love my cat 1111
7. I love my cat 5555

输出:

1. I love my country 1234
2. I love my city 1234
3. I love my pet 1111
4. I love my cat 1111

尝试过:sort -u没有给出正确的结果。

答案1

尝试:

awk '{c[$NF+0]++; a[NR]=$NF+0; b[NR]=$0} END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}' file

使用您的输入文件:

$ cat file
I love my country 1234
I love Newyork 5678
I love my city 1234
I love my pet 1111
I love my dog 2222
I love my cat 1111
I love my cat 5555

上述命令产生:

$ awk '{c[$NF+0]++; a[NR]=$NF+0; b[NR]=$0} END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}' file
I love my country 1234
I love my city 1234
I love my pet 1111
I love my cat 1111

多行版本

对于那些喜欢将命令分散在多行中的人:

awk '
    {
        c[$NF+0]++
        a[NR]=$NF+0
        b[NR]=$0
    }
    END{
        for(i=1; i<=NR; i++)
            if (c[a[i]]>1)
                print b[i]
    }
    ' file

现在可以了

  • c[$NF+0]++

    该数组c现在多次跟踪文件中每行最后一个字段中出现的数字。

  • a[NR]=$NF+0

    数组a在行号键 下存储行最后一个字段中的数字NR

  • b[NR]=$0

    对于行号NR,数组b存储该行。

  • END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}

    到达文件末尾后,它会再次循环遍历每一行,如果c该行中的数字计数(由 给出a)大于 1,则打印该行。

相关内容