从文件中的行中删除重复的字符串
Removing duplicate strings from lines in a file
我正在尝试删除文件行中的重复字符串。我尝试使用 uniq,但这只适用于删除重复行,而不是行中的重复字符串。
我只关心 = 号后的 "words" 并且 "words" 是任意序列的非空格但不能包含 = 号。
我的文件如下所示:
LINE1=hello hello world
LINE2=hello world world
LINE3=hello hello hello
我希望它看起来像什么:
LINE1=hello world
LINE2=hello world
LINE3=hello
这是对您可能正在寻找的内容的一种可能解释:
$ awk -F'=' '{words=""; delete seen; split(,t,/ /); for (i=1;i in t;i++) if (!seen[t[i]]++) words = (words=="" ? "" : words " ") t[i]; print FS words}' file
LINE1=hello world
LINE2=hello world
LINE3=hello
它基于很多假设,但主要是你只关心 =
符号后面的 "words" 并且 "words" 是任何非空格序列但不能包含=
个迹象。
我想到了这个 awk:
awk -F '[= ]' '{delete a; a[]++; printf "%s=%s", , ;
for (i=3; i<=NF; i++) if (!a[$i]++) printf "%s%s", OFS, $i; print ""}' file
LINE1=hello world
LINE2=hello world
LINE3=hello
$ awk 'BEGIN {FS="( |=)"} {for(i=1;i<=NF;i++) {if(!seen[$i]++) printf "%s%s", $i, (i==1?"=":OFS)} printf ORS; delete seen}' file
LINE1=hello world
LINE2=hello world
LINE3=hello
awk 'NF--{sub(/hello/,"world",)}/LINE3/{sub(/world/,"")}1' file
LINE1=hello world
LINE2=hello world
LINE3=hello
我正在尝试删除文件行中的重复字符串。我尝试使用 uniq,但这只适用于删除重复行,而不是行中的重复字符串。
我只关心 = 号后的 "words" 并且 "words" 是任意序列的非空格但不能包含 = 号。
我的文件如下所示:
LINE1=hello hello world
LINE2=hello world world
LINE3=hello hello hello
我希望它看起来像什么:
LINE1=hello world
LINE2=hello world
LINE3=hello
这是对您可能正在寻找的内容的一种可能解释:
$ awk -F'=' '{words=""; delete seen; split(,t,/ /); for (i=1;i in t;i++) if (!seen[t[i]]++) words = (words=="" ? "" : words " ") t[i]; print FS words}' file
LINE1=hello world
LINE2=hello world
LINE3=hello
它基于很多假设,但主要是你只关心 =
符号后面的 "words" 并且 "words" 是任何非空格序列但不能包含=
个迹象。
我想到了这个 awk:
awk -F '[= ]' '{delete a; a[]++; printf "%s=%s", , ;
for (i=3; i<=NF; i++) if (!a[$i]++) printf "%s%s", OFS, $i; print ""}' file
LINE1=hello world
LINE2=hello world
LINE3=hello
$ awk 'BEGIN {FS="( |=)"} {for(i=1;i<=NF;i++) {if(!seen[$i]++) printf "%s%s", $i, (i==1?"=":OFS)} printf ORS; delete seen}' file
LINE1=hello world
LINE2=hello world
LINE3=hello
awk 'NF--{sub(/hello/,"world",)}/LINE3/{sub(/world/,"")}1' file
LINE1=hello world
LINE2=hello world
LINE3=hello