Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting UNIX Grep函数_Sorting_Unix_Grep_Cut_Uniq - Fatal编程技术网

Sorting UNIX Grep函数

Sorting UNIX Grep函数,sorting,unix,grep,cut,uniq,Sorting,Unix,Grep,Cut,Uniq,我有一个以制表符分隔的列的文件。我想计算列中的唯一条目。但是,我希望仅基于列中的enter键计算unique,并删除括号中的任何后续标记 该表如下所示: 1 abc def xxx(sd) 5677 2 ddd hhh yyy(dd) 4321 3 fds ggf xxx(df) 5666 现在我想计算计算xxx和yyy的唯一次数 所以预期的输出应该是2,而我得到的是3 我使用的代码是: cut -f4 f.txt| sort| uniq -D |wc -l 标准调试技术:单步执行,检查中间

我有一个以制表符分隔的列的文件。我想计算列中的唯一条目。但是,我希望仅基于列中的enter键计算unique,并删除括号中的任何后续标记

该表如下所示:

1 abc def xxx(sd) 5677
2 ddd hhh yyy(dd) 4321
3 fds ggf xxx(df) 5666
现在我想计算计算
xxx
yyy
的唯一次数

所以预期的输出应该是
2
,而我得到的是
3

我使用的代码是:

cut -f4 f.txt| sort| uniq -D |wc -l

标准调试技术:单步执行,检查中间输出

使用
cut-f4
可以获取第四个字段,在本例中为:

xxx(sd)
yyy(dd)
xxx(df)
这是三个不同的条目,不管你如何排序

详细说明我对
-k
选项
排序
的评论,这给出了预期的“2”。(我不确定您使用
-D
选项对
uniq
做了什么)

-k4.1,4.3
表示“按第四个字段的第1到第3个字符进行排序”,
-u
表示“仅列出唯一行”,结果:

1   abc def xxx(sd) 5677
2   ddd hhh yyy(dd) 4321
第二行
xxx
不清晰,未列出


编辑

或者,您可以使用
sed
提取输入行的所需部分,并将其馈送到
sort-u | wc-l
。我还没有完全理解您输入的规格,所以我仍然在猜测:

sed "s/\(\S\+\s\+\)\{3\}\([^(]\+\).*/\2/" f.txt
解释:

  • \S\+\S\+
    -1..n个非空白,后跟1..n个空白
  • \(\S\+\S\+\){3\}
    -…重复三次
  • \([^(]\+\)
    -…后跟1..n个非
    )字符
  • *
    -…后跟任何内容
  • /\2/
    -…替换为与第二组匹配的任何字符(1..n个非
    )的字符)
这使得:

xxx
yyy
xxx

不管它值多少钱,你也可以试试这个,它会让你数一数某件事被重复了多少次(xxx和yyy):

如果你只需要不同的数字,只需添加
wc-l
,就像这样

cat test.txt | awk {'print substr($4,0,4)'} | sort | uniq --count | wc -l
我不确定这是否是最好的方法,但它是有效的


请告诉我您的想法。

您可以通过以下方式检查每个块出现的次数:

$ awk -F"[ (]" '{a[$4]++} END {for (i in a) print i, a[i]}' file
xxx 2
yyy 1
解释
  • -F“[(]”
    将字段分隔符设置为空格或
  • {a[$4]+}
    跟踪第四个字段出现的次数(基于这些字段分隔符,即
    xxx
    yyy
    …)
  • END{for(a中的i)print i,a[i]}
    打印结果

如果您只关心可以使用哪些不同的值:

$ awk -F"[ (]" '{a[$4]} END {for (i in a) print i}' file
xxx
yyy
解释
  • -F“[(]”
    将字段分隔符设置为空格或
  • {a[$4]}
    跟踪出现的第四个字段(基于这些字段分隔符,即
    xxx
    yyy
    …)
  • END{for(a中的i)print i}
    不使用计数器打印结果

请注意,
sort
有一个
-k
选项,允许您按输入的指定部分进行排序,无需首先对输入进行
cut
操作。我看不出该选项如何给出3。在更正
cut
命令后,运行该选项时,第四列为0,因为所有行的字符数都是唯一的列中根据哪些唯一条目进行计算的参数可能会有所不同。因此,我想计算所有可能的条目,只要它们是唯一的。初始数字也是一个列,但我想要的是,它应该告诉我xxx和yyy是唯一的,而不是将括号条件作为唯一内容的一部分。例如:cut-f4给了我xxx(sd)yyy(dd)xxx(df)xx(gg)yyz(rd)…现在我想知道有多少个唯一的xxx,yyy,xx,yyz。我不关心括号,我只想知道括号前面的值重复的次数。@Ankur:对不起,我无法理解您的意图。据我所知,我的答案与您的要求完全一致。添加了一些解释更清楚。@Ankur:使用
sed
添加了替代方案。您应该能够根据需要调整两个解决方案中的一个。输入可以是2个字符,后跟括号,也可以是6个字符,后跟brakset。因此,它可以是xx(ds)或zzzzzzzz(hh)@Ankur:从你对我的回答的评论来看,只要括号前有少于或多于3个字符,这个
awk
就会让你失败。你需要精确地指定可能的输入,然后正确提取你想要计算的内容。尝试和错误并不会减少它。请注意
cat文件| awk'…'
可以重写为
awk'…'文件
$ awk -F"[ (]" '{a[$4]++} END {for (i in a) print i, a[i]}' file
xxx 2
yyy 1
$ awk -F"[ (]" '{a[$4]} END {for (i in a) print i}' file
xxx
yyy