首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找与awk一起使用标识符的行范围。

查找与awk一起使用标识符的行范围。
EN

Stack Overflow用户
提问于 2018-03-19 10:35:48
回答 4查看 123关注 0票数 3

我有一份文件如下:

file1.txt

代码语言:javascript
运行
复制
1  10  ABC KK-LK
1  33  23  KK-LK
2  34  32  CK-LK,LK
11 332 2   JK@
21 525 1   JK@
31 902 9   JK@
11 23  2   JK2

我试图在第4栏中看到标识符使用的行数:

代码语言:javascript
运行
复制
KK-LK 1-2
CK-LK 3-3
JK@   4-6
JK2   7-7

如果我应用下面的代码,我可以得到number of lines,但是它在一个新行而不是一个range中打印它,这将是一个问题,因为每个identifier至少有一个1 million lines

代码语言:javascript
运行
复制
grep -n "KK-LK" file1.txt | awk -F  ":" '{print $1}'
1
2

我怎样才能把这个转换成一个范围?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-19 11:31:27

awk解决方案:

代码语言:javascript
运行
复制
awk '{ if ($4 in a) sub(/-[0-9]+/, "-"NR, a[$4]); else a[$4] = NR"-"NR }
     END{ for (i in a) print i, a[i] }' file

产出:

代码语言:javascript
运行
复制
JK2 7-7
CK-LK,LK 3-3
JK@ 4-6
KK-LK 1-2
票数 2
EN

Stack Overflow用户

发布于 2018-03-19 10:49:25

请你试着跟我说一下,如果这对你有帮助的话,请告诉我。

代码语言:javascript
运行
复制
awk '{a[$NF]=a[$NF]?a[$NF] OFS FNR:FNR} END{for(i in a){num=split(a[i],array," ");if(num>1){print i,array[1] "-" array[num]} else {print i,a[i]"-"a[i]}}}'  Input_file

现在也加入了一种非单一的线性解决方案。

代码语言:javascript
运行
复制
awk '
{
  a[$NF]=a[$NF]?a[$NF] OFS FNR:FNR}
END{
  for(i in a){
    num=split(a[i],array," ");
    if(num>1){
      print i,array[1] "-" array[num]}
    else{
      print i,a[i]"-"a[i]}
}}
'   Input_file
票数 2
EN

Stack Overflow用户

发布于 2018-03-19 14:47:09

另一个awk

代码语言:javascript
运行
复制
$ awk '{if($NF in a) b[$NF]=NR; 
        else a[$NF]=b[$NF]=NR} 
    END{for(k in a) print k,a[k]"-"b[k]}' file | sort -k2 | column -t

KK-LK     1-2
CK-LK,LK  3-3
JK@       4-6
JK2       7-7

或者,自从NR>0

代码语言:javascript
运行
复制
$ awk '!a[$NF]{a[$NF]=NR} {b[$NF]=NR} END{for(k in a) print k,a[k]"-"b[k]}'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49360827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档