找到与awk一起使用标识符的行范围

时间:2018-03-19 10:35:48

标签: linux awk

我的文件为:

FILE1.TXT

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列中标识符使用的行数:

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

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

grep -n "KK-LK" file1.txt | awk -F  ":" '{print $1}'
1
2

如何将此转换为范围?

4 个答案:

答案 0 :(得分:2)

请您试着跟随并告诉我这是否对您有帮助。

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

现在也添加非单线形式的解决方案。

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

答案 1 :(得分:2)

awk 解决方案:

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

输出:

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

答案 2 :(得分:2)

另一个awk

$ 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

$ awk '!a[$NF]{a[$NF]=NR} {b[$NF]=NR} END{for(k in a) print k,a[k]"-"b[k]}'

答案 3 :(得分:1)

你可以像这样一次通过:

parse.awk

# Initialize start-line and id variables
NR == 1  { s=1; id = $4 }      

# When the id no longer matches print the range
$4 != id { 
  print id ": " s "-" NR-1

  # Reset variables for the next id
  s=NR; id=$4
}

# Print the last range when EOF occurs
END { 
  print id ": " s "-" NR
}

像这样运行:

awk -f parse.awk infile.txt

输出:

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