shell 查找2列文件中出现次数最少的值

y53ybaqx  于 2023-03-19  发布在  Shell
关注(0)|答案(2)|浏览(104)

我有一个动态生成的txt文件,其结构为-〉Code[space]Link
这是一个简单的

15210 https://test1.com
4 https://test2.com
1020 https://testc.com
152 https://testz.com
152 https://test5.com
10 https://test54.com
152 https://testx.com
10 https://testds.com
15210 https://testmp.com

它可以变得更大,高达1亿线
我想只显示文件上的所有链接,只有当相同的代码没有重复或等于3次,例如。
在这种情况下,输出将是

https://test1.com
https://test2.com
https://testc.com
https://test54.com
https://testds.com
https://testmp.com

在152代码前面的所有链接不会显示在输出中,因为152重复〉= 3次。如果任何其他代码值重复〉=3次,情况相同。
只是,我希望这个条件的数字是3在上面的例子是用户输入的命令。

bfrts1fy

bfrts1fy1#

您也可以使用awk对排序后的输出执行一次遍历。例如,您可以执行以下操作:

sort -n yourfile |
awk '
  FNR == 1 {
    code = $1
    lasturl[$2] = 1
    n = 1
    next
  }
  $1 == code {
    n++
    lasturl[$2] = 1
    next
  } 
  {
    if (n < 3) {
      for (i in lasturl)
        print i
    }
    code = $1
    delete lasturl
    lasturl[$2] = 1
    n = 1
  }
  END { if (n < 3) for (i in lasturl) print i }
'

(最大数组就是重复代码的最大数量(例如,三个152代码对应3个元素),而不是每个代码对应一个元素)

使用/输出示例

sort -n将更改输出顺序,但在上面的yourfile中给定输入,您将具有:

https://test2.com
https://testds.com
https://test54.com
https://testc.com
https://testmp.com
https://test1.com

如果你有问题就告诉我。

iovurdzv

iovurdzv2#

您可以执行两遍解决方案,如下所示:

awk 'FNR==NR{cnt[$1]++; next} cnt[$1]<3{print $2}' file file

图纸:

https://test1.com
https://test2.com
https://testc.com
https://test54.com
https://testds.com
https://testmp.com

或者,如果$1中定义了很多元素,但内存无法保存它们,可以先排序,然后将块分开,然后只打印少于3行的块中的行中的$2

sort -n file | awk '
    $1==last || FNR==1{print; last=$1; next}
    {last=$1; print ""; print}
' | awk '
    BEGIN { RS = "" ; FS = "\n" }
    NF<3{for(i=1;i<=NF;i++) {
        split($i, a, " ")
        print a[2]
        }
    }
'

这样会比较慢,并且原始文件中的顺序会丢失。

相关问题