Unix 如何使用awk脚本删除重复列
我有以下几点Unix 如何使用awk脚本删除重复列,unix,awk,sed,gawk,Unix,Awk,Sed,Gawk,我有以下几点 444, 1234, (1234), 3453534, 43534543 我希望输出是 444, (1234), 3453534, 43534543 我知道awk是最好的解决方案 但我无法想出解决办法 新行可以在任意位置放置唯一列。只需要括号中的值 总之,如果是重复的,我们需要去掉没有括号的值 e、 g.如果我们的列为: (1234) 1234 ----> we want it to be (1234) 非常感谢如果我能很好地理解每个输入行,那么必须解析所有值字段,然后
444, 1234, (1234), 3453534, 43534543
我希望输出是
444, (1234), 3453534, 43534543
我知道awk是最好的解决方案
但我无法想出解决办法
新行可以在任意位置放置唯一列。只需要括号中的值
总之,如果是重复的,我们需要去掉没有括号的值
e、 g.如果我们的列为:
(1234) 1234 ----> we want it to be (1234)
非常感谢如果我能很好地理解每个输入行,那么必须解析所有值字段,然后跳过所有值字段。我假设除最后一个字段外,所有字段都以逗号字符结尾 以下是我的建议:
awk ' { delete a; s="" # Reset tmp values
#Search for all (...) fields
for(i=1;i<=NF;++i) {
if (match($i,/^\((.*)\),?$/)) {
num=$i; gsub(/(^\(|\),?$)/,"",num);
a[num","]=1;
}
}
#Skip all fields contained by a hash
for(i=1;i<=NF;++i) if(!(($i)(i<NF?"":",") in a)) s=s FS $i;
# Trim leading field separator and trailing comma (if exists)
gsub("(^"FS"|,$)","",s);
print s;
}' inputfile
输出:
444, (1234), 3453534, 43534543
444, (1235), 1234, 3453534, 43534543
444, (1235), 3453534, 43534543, (1234)
444, 1235, 1235, 1235, 1234, 3453534, 43534543
444, (1234)
444, (1235)
我希望这有点帮助 如果我做出以下假设: 每行只有一个唯一的列 分隔符在行中的所有位置都相同,但末尾除外:$ 下面是一个用于删除问题中所述重复项的awk可执行文件:
#!/usr/bin/awk -f
BEGIN {FS=", "}
match($0, /\([[:alnum:]]*\)/) {
p=substr($0, RSTART, RLENGTH) # pattern to match
gsub(p "(" FS "|$){1}", "") # remove duplicates from $0
sub(FS "$", "") # clean up trailing delimiters
}
47
或者,当删除每行只有一个唯一列的假设时:
#!/usr/bin/awk -f
BEGIN {FS=", "}
{
for(i=1;i<=NF;i++) {
if(match($0, "\\(" $i "\\)")) {
p=substr($0, RSTART, RLENGTH) # pattern to match
gsub(p "(" FS "|$){1}", "") # remove duplicates from $0
}
}
sub(FS "$", "") # clean up trailing delimiters
}
47
在每种情况下,都会使用gsub更新$0以删除重复项,而不是对单个字段进行操作,47的计算结果为true以打印$0,无论它是否被更改。括号是数据的一部分吗?1234是1234的一个副本,?如果它们打印在括号内条目所在的插槽中,或者第一个无括号条目出现在插槽中或其他地方。老实说,只要稍加努力,您就可以在样本输入和预期输出方面做得更好,以显示问题的复杂性。nirvanastack请更新您的问题,以显示样本输入,包括我问过的所有案例以及您知道的我没想过要问的其他案例,与预期输出相匹配@天网-不,这个问题的答案对于这个问题和那个问题来说都太复杂了,我只能一眼就知道。你想要1234、1234、1234、1234行的结果是什么?逗号后面的空格真的在文件中吗?非常感谢你的努力。@nirvanastack:这是你需要的吗?
#!/usr/bin/awk -f
BEGIN {FS=", "}
{
for(i=1;i<=NF;i++) {
if(match($0, "\\(" $i "\\)")) {
p=substr($0, RSTART, RLENGTH) # pattern to match
gsub(p "(" FS "|$){1}", "") # remove duplicates from $0
}
}
sub(FS "$", "") # clean up trailing delimiters
}
47