我只想删除同一行上的重复列/字段。我尝试过,但最终得到了一个带有嵌套循环、条件和数组的长代码,但这些代码无法正常工作。
- 输入数据:
1 2 3 4 1 2 3 1 1 2 1 3 4 4 3 2 3 3 3 2 1 1 1 1 5 2 2 7
- 期望的输出:
1 2 3 4 1 2 3 1 2 3 4 3 2 3 2 1 5 2 7
答案1
使用awk
:
awk '{
for(i=1; i<=NF; i++)
printf "%s", (!seen[$i]++? (i==1?"":FS) $i: "" )
delete seen; print ""
}' infile
答案2
awk '{
for (i=1; i<=NF; i++) {
if ( !seen[NR,$i]++ ) {
printf "%s%s", (i>1 ? OFS : ""), $i
}
}
print ""
}' file
1 2 3 4
1 2 3
1 2 3
4 3 2
3 2
1
5 2 7
答案3
awk '
{
split($0,a); $0=""
for (i=j=1; i in a; i++)
if (!(index(FS $0 FS,FS a[i] FS)))
$(j++) = a[i]
}1' file
输出:-
1 2 3 4
1 2 3
1 2 3
4 3 2
3 2
1
5 2 7
perl -lane 'my %h;
print join $", grep { !$h{$_}++ } @F;
' file
使用 GNU sed 并打开扩展正则表达式模式-E
:
sed -Ee '
s/.*/ & /;ta
:a
s/( (\S+) (.* )?)\2 /\1/
ta
s/ (.*) /\1/
' file
答案4
大部分与其他答案类似,但通过重建“当前记录”,1
在最后通过该方式打印它。
awk '
{
delete seen
nf = 0
for (i = 1; i <= NF; ++i)
if (!seen[$i]++)
field[++nf] = $i
$0 = ""
for (i = 1; i <= nf; ++i)
$i = field[i]
}; 1' file
再次,但摆脱一个循环(通过调用使其隐式split()
):
awk '
{
delete seen
nf = split($0, fields)
$0 = ""
for (i = 1; i <= nf; ++i)
if (!seen[fields[i]]++)
$(NF+1) = fields[i]
}; 1' file