awk:打印以逗号分隔的行号

时间:2014-10-17 19:01:04

标签: awk gawk

awk '{for (i = 1; i <= NF; i++) {gsub(/[^[:alnum:]]/, " "); print tolower($i)": "NR | "sort -V | uniq";}}' input.txt

使用上面的代码,我输出为:

line1: 2
line1: 3
line1: 5
line2: 1
line2: 2
line3: 10

我想要如下:

line1: 2, 3, 5
line2: 1, 2
lin23: 10

如何实现它?

2 个答案:

答案 0 :(得分:0)

使用gawk的array features。一旦我搞砸了,我就会提供实际的代码。

awk '{for (i = 1; i <= NF; i++) {
    gsub(/[^[:alnum:]]/, " "); 
    arr[tolower($i)] = arr[tolower($i)]NR", "}
  } 
  END {
    for (x in arr) {
      print x": "substr(arr[x], 1, length(arr[x])-2);
  }}' input.txt | sort

请注意,如果一个单词在同一行上多次出现,则包含重复的行号。

答案 1 :(得分:0)

使用perl ...

#!/usr/bin/perl

while(<>){
  if( /(\w+):\s*(\d+)/){       # extract the parts
     $arr{lc($1)}{$2} ++       # count them
  };    
}

for my $k (sort keys %arr){    # print sorted alpha
  print "$k: ";
  $lines=$arr{$k};
  print join(", ",(sort {$a<=>$b} keys %$lines)),"\n";  print sorted numerically
}

此解决方案删除了​​对重复数字进行排序。这是你需要的吗?