对txt文件进行排序,查找重复项,同时打印它们所在的行

时间:2017-10-31 10:13:25

标签: linux shell awk sed

给定一个txt文件,它具有以下值:

123 
123 
234 
234 
123 
345    

我用

sort FILE | uniq -cd

为了获得每个值的计数。 但是我怎么能输出它被发现的行?

输出:

123  3 0;1;4
234  2 2;3

行数基于零,因此是上述数字。

4 个答案:

答案 0 :(得分:1)

awk 解决方案:

awk '{ a[$1]=($1 in a? a[$1]";":"")(NR-1); cnt[$1]++ }
     END{ for(i in a) if(a[i]~/;/) { print i,cnt[i],a[i] } }' file
  • a[$1]=($1 in a? a[$1]";":"")(NR-1) - 通过将多个匹配项与0

    $1累积行号(从;开始) >
  • cnt[$1]++ - 计算值出现次数

输出:

123 3 0;1;4
234 2 2;3

答案 1 :(得分:0)

下面也可以帮助你,它也会对输出进行排序。

awk '{a[$0]++;b[$0]=b[$0]?b[$0]";"(FNR-1):(FNR-1==0?"0":FNR-1)} END{for(i in a){print i,a[i],b[i] | "sort"}}'   Input_file

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

awk '{
a[$0]++;
b[$0]=b[$0]?b[$0]";"(FNR-1):(FNR-1==0?"0":FNR-1)
}
END{
for(i in a){
  print i,a[i],b[i] | "sort"
}}
'   Input_file

答案 2 :(得分:0)

我知道问题是标记为awk / sed,但是为了比较看看Python版本有多详细:

import sys

dictionary = {}
for i, line in enumerate(sys.stdin):
    dictionary.setdefault(line.strip(), []).append(str(i))

for value, lines_numbers in dictionary.items():
    print(value, len(line_numbers), ";".join(line_numbers))

测试:

$ python script.py < FILE
123 3 0;1;4
234 2 2;3
345 1 5

答案 3 :(得分:0)

awk '
{
  frequency[$1]++
  if (line[$1]=="")
  {
    line[$1]=NR-1
  }
  else
  {
    line[$1]=line[$1]";"NR-1
  }
}
END{
  for (j in frequency)
    if (frequency[j]>1)
      print j, frequency[j], line[j]
}' file
  

$1:第一栏的内容

     

NR:当前行号

输出:

234 2 2;3
123 3 0;1;4