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
这类似于Unixuniq
过滤器,它只打印相邻的副本
如果文件中的重复项是随机的,可以先排序:
$ 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