Awk 在列中找到重复的单词并删除
我有一个包含数据的文件Awk 在列中找到重复的单词并删除,awk,sed,Awk,Sed,我有一个包含数据的文件 AND (CP),(D),(SE),(SI),(CP),(D),(SE),(SI) (Q),(Q) 1 OR (CP),(D),(E),(SE),(SI),(CP),(D),(E),(SE),(SI) (Q),(Q) 1 DFF (CP),(D),(E),(CP),(D),(E) (QN),(QN) 1 我希望输出为 AND (CP),(D),(SE),(SI)
AND (CP),(D),(SE),(SI),(CP),(D),(SE),(SI) (Q),(Q) 1
OR (CP),(D),(E),(SE),(SI),(CP),(D),(E),(SE),(SI) (Q),(Q) 1
DFF (CP),(D),(E),(CP),(D),(E) (QN),(QN) 1
我希望输出为
AND (CP),(D),(SE),(SI) (Q) 1
OR (CP),(D),(E),(SE),(SI) (Q) 1
DFF (CP),(D),(E) (QN) 1
我想删除第2列和第3列中出现的重复术语,如第2列第一行中的CP、D、SE、SI再次重复,因此应删除第3列中相同的重复术语Q重复,因此重复的一个应删除
我用awk试过了
awk '!seen[$2]++' file
但是找不到获取错误[您可以使用此awk:
awk'函数dedupcol,a,seen,i,s{split$col,a,/,/;s=;for i=1;i在a;++i if!seen[a[i]++s=s==?:,a[i];$col=s;}{dedup2;dedup3}1'文件|列-t
和CP,D,SE,siq1
或CP、D、E、SE、SI Q 1
DFF CP、D、E QN 1
扩展形式:
awk’函数包括col、a、seen、i、s{
拆分$col,a,//
s=
对于i=1;a中的i;++i
如果!看到[a[i]]++
s=s=s=?:,a[i]
$col=s
}
{
重复数据2
重复数据3
}1'文件|列-t
列-t仅用于表格输出。根据所显示的示例,请尝试以下内容。使用GNU awk编写并测试。创建了一个名为removeDup的函数,只需将所有字段号传递到要删除重复项的位置,如2,3,以删除第2和第3个字段中的重复项,然后就可以设置好
awk '
BEGIN{ s1="," }
function removeDup(fields){
num=split(fields,fieldNum,",")
for(k=1;k<=num;k++){
delete arr1
delete arrVal1
val1=num1=""
num1=split($fieldNum[k],arr1,",")
for(i=1;i<=num1;i++){
if(!arrVal1[arr1[i]]++){
val1=(val1?val1 s1:"")arr1[i]
}
}
$fieldNum[k]=val1
}
}
{
removeDup("2,3")
}
1
' Input_file
说明:增加对以上内容的详细说明
awk ' ##Starting awk program from here.
BEGIN{ s1="," } ##Setting s1 value to comma in BEGIN section.
function removeDup(fields){ ##Creating function removeDup passing fields to it.
num=split(fields,fieldNum,",") ##Splitting fields into fieldNum array here.
for(k=1;k<=num;k++){ ##Running for loop till value of num here.
delete arr1 ##Deleting arr1 here.
delete arrVal1 ##Deleting arrVal1 here.
val1=num1="" ##Nullify val1 and num1 here.
num1=split($fieldNum[k],arr1,",") ##Splitting field(fieldNum value) into arr1 here.
for(i=1;i<=num1;i++){ ##Running for loop till value of num1 here.
if(!arrVal1[arr1[i]]++){ ##Checking condition if current arr1 values is NOT present in arrVal1 then do following.
val1=(val1?val1 s1:"")arr1[i] ##Creating val1 here and keep on adding value to it.
}
}
$fieldNum[k]=val1 ##Assigning currnet field value as val1 value here.
}
}
{
removeDup("2,3") ##Calling removeDup function in main program with 2nd and 3rd field numbers passed to it.
}
1
' Input_file ##mentioning Input_file name here.
如果重复的部分始终完全相同,并且重复了两次,则可以使用sed:
sed -E 's/ (.+),\1 / \1 /g'
重复的术语总是以相同的顺序吗?是的,总是以相同的顺序重复它们非常聪明!…这适用于CP、D、E形式的输入,但当输入为CDN、CP、D、SE、SI、CDN、CP、D、SE、SI时,没有不正确的更改。它将CDN、CP、D、SE、SI、CDN、CP、D、SE、SI转换为CDN、CP、D、SE、SI。如果您显示实际数据,我可以生成输出再一次