Awk 当发现重复时,打印整行

Awk 当发现重复时,打印整行,awk,data-processing,Awk,Data Processing,这是我输入的片段: DGD3 SOL10 DGD53 SOL15 DGD100 SOL15 DGD92 SOL20 DGD41 SOL22 DGD62 SOL35 DGD13 SOL40 DGD13 SOL40 我的预期产出 DGD53 SOL15 DGD100 SOL15 DGD13 SOL40 DGD13 SOL40 在我的数据中,有时会出现SOL重复(不超过两次重复,例如文件中某个SOL的三次,但仅重复)。索尔在我的第二栏(2美元)。所以我需要一个程序,打印整行(DGD和溶胶)时,我发

这是我输入的片段:

DGD3 SOL10
DGD53 SOL15
DGD100 SOL15
DGD92 SOL20
DGD41 SOL22
DGD62 SOL35
DGD13 SOL40
DGD13 SOL40
我的预期产出

DGD53 SOL15
DGD100 SOL15
DGD13 SOL40
DGD13 SOL40

在我的数据中,有时会出现SOL重复(不超过两次重复,例如文件中某个SOL的三次,但仅重复)。索尔在我的第二栏(2美元)。所以我需要一个程序,打印整行(DGD和溶胶)时,我发现重复溶胶($2)。您能帮助我吗?

根据所示示例(按第二个字段排序),您可以执行以下操作:

$ awk 'l2==$2{print ll; print; next}
       {ll=$0; l2=$2}' file
印刷品:

DGD53 SOL15
DGD100 SOL15
DGD13 SOL40
DGD13 SOL40
这类似于Unix
uniq
过滤器,它只打印相邻的副本

如果文件中的重复项是随机的,可以先排序:

$ awk 'l2==$2{print ll; print; next}
            {ll=$0; l2=$2}' <(sort -k 2 file) 
或者,要仅识别2个或更多的SOL标记,您可以执行以下操作:

$ awk '++cnt[$2]==2' file   
您可以使用相同的方法生成命令代码,以
grep
sed
从未排序的文件打印:

$ sed -n -f <(awk '++cnt[$2]==2 {printf "/[[:space:]]%s$/p\n", $2}' file) file

$sed-n-f您可以使用此
awk
,它将打印重复的不一定是相邻的

awk'$2在map{print map[$2]或$0}{map[$2]=$0}文件中
DGD53 SOL15
DGD100 SOL15
DGD13 SOL40
DGD13 SOL40

在awkish样式中添加了另一种方式,即获取输入文件第一次读取时的所有值计数,并根据第二次读取时的计数打印所有值。公平警告:这可能不如其他两种解决方案快,但从理解目的来看应该简单

awk '
FNR==NR{
  count[$2]++
  next
}
(count[$2]>1)
' Input_file  Input_file

如果您的文件在第二个字段中排序,
uniq
是为此任务设计的,具有正确的选项

$ uniq -f1 -D file

DGD53 SOL15
DGD100 SOL15
DGD13 SOL40
DGD13 SOL40

跳过第一个字段,打印所有副本…

另一个awk。如果第二个字段的实例超过2个,则不需要对文件进行排序的单次运行可以正常工作。在最坏的情况下,它会散列内存中的完整文件,并且不会产生任何输出:

$ awk '{
    if(!c[$2]++)           # if first instance of $2
        a[$2]=$0           # store it
    else {
        if(c[$2]==2) {     # if second instance 
            print a[$2]    # print previous
            delete a[$2]   # no need to waste my memory any more
        } 
        print              # after first instance of $2 we always print current
    }
}' file
输出:

DGD53 SOL15
DGD100 SOL15
DGD13 SOL40
DGD13 SOL40

副本是否总是挨在一起,或者它们可能在文件中的任何位置?可能是anywhere@Mark然后您应该在您的示例中说明,因为这需要一个不同的解决方案,当行是连续的时,它可以工作
DGD53 SOL15
DGD100 SOL15
DGD13 SOL40
DGD13 SOL40