我有一个文件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中清除地图吗?
答案 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