如何在awk中清除地图?

时间:2017-02-17 10:25:07

标签: dictionary awk

我有一个文件a.txt。 a.txt中的每一行都有许多数字:

1 2 3 1 2
5 6 7 7
19 20 20

我必须打印每一行没有重复的数字,就像下面的结果一样:

1 2 3
5 6 7
19 20

我在awk中使用地图,但每次都必须清除地图。 我不知道在阅读每一行时如何清除awk中的地图。

awk '{ split($0, arr, " "); \
for(i=1;i<=length(arr);i++){dup_map[arr[i]]=1;} \
for(num in dup_map){printf("%s ", num);} printf("\n"); clear dup_map; } \
}' a.txt

有人能告诉我如何在awk中清除地图吗?

4 个答案:

答案 0 :(得分:2)

gawk有一个函数delete

delete array

在awk中,这可以通过

来实现
split("", array)
  

拆分功能(请参阅字符串的内置函数一节   操作)首先清除目标阵列。这个电话要求它   拆分空字符串。由于没有数据要拆分,所以   函数只是清除数组然后返回。

(我在gawk manual on www.chemie.fu-berlin.de上找到了这个。)

答案 1 :(得分:0)

awk '{split("",M);for(i=1;i<=NF;i++)if($i in M)$i="";else M[$i]++;$0=$0}7' YourFile

注意:

awk '# for non empty lines
   /./ {
      # reset array Map
      split( "", Map)
      # for each field (separtor is space)
      for( i=1; i<=NF ;i++) {
         # if the field content is in map, set it to empty string
         # if not, add it to the map
         if( $i in Map) $i=""
          else Map[ $i]++
         }
      # rewrite the line for single separator (not mandatory)
      $0=$0
      }
   # print the resulting line (default action)
   7 { print }
   ' YourFile

答案 2 :(得分:0)

这是做你想做的事的正确方法:

$ awk '{
    delete(seen)
    for ( i=1; i<=NF; i++ ) {
        if ( !seen[$i]++ ) {
            printf "%s%s", (i>1 ? OFS : ""), $i
        }
    }
    print ""
}' file
1 2 3
5 6 7
19 20

请注意使用名为seen的数组的惯用方法来跟踪之前看到的$i值,以及字段将按照它们发生的顺序打印(您还有其他答案)使用in运算符随机化他们的顺序,并且每行末尾不会打印尾随空白字符(你也有答案)。

答案 3 :(得分:-1)

请注意,您不需要初始拆分,因为awk已经为您拆分了字段,

$ awk '{delete a; 
        for(i=1;i<=NF;i++) a[$i]; 
        for(k in a) printf "%s ", k; 
        print ""}' file

1 2 3
5 6 7
19 20

或删除条目而不是数组

$ awk '{for(i=1;i<=NF;i++) a[$i]; 
        for(k in a) 
          {printf "%s ", k; delete a[k]} 
        print ""}' file