Awk 比较文本文件中的行

Awk 比较文本文件中的行,awk,sed,text-processing,Awk,Sed,Text Processing,我有一个这样的文件,由选项卡分隔: 1 abc 2 abc 3 def 4 abc 1 abc 5 def 我想通过比较第二列的连续行来生成另一个文件。deisred输出如下所示: 1 2 1 4 3 5 我试过这种方法,但没有成功: awk '{ dat[$2]++; } END{ for (var in dat) if (var==$2){print $1,previous}; previous =$1}' file.txt 使用awk实现此目的的任何建议如果您对输入文件进行排序,则

我有一个这样的文件,由选项卡分隔:

1 abc
2 abc
3 def
4 abc
1 abc
5 def
我想通过比较第二列的连续行来生成另一个文件。deisred输出如下所示:

1 2
1 4
3 5
我试过这种方法,但没有成功:

awk '{
dat[$2]++;
}
END{
for (var in dat)
if (var==$2){print $1,previous};
previous =$1}' file.txt 

使用awk实现此目的的任何建议如果您对输入文件进行排序,则速度会快得多:

$ sort -k 2d data| awk '{ if (last==$2 && $1 != firstnum) { printf("%d\t%d\n", firstnum, $1); }; if (last!=$2) { last=$2; firstnum=$1; printf("%d\t%d\n", firstnum, firstnum); }}'
1   1
1   2
1   4
3   3
3   5

我不确定您是否要打印(1,1)和(3,3)对。但我想如果你有一个只出现在一行上的键,你可能想打印它,所以我把它留在了。如果不需要,您可以取出第二个printf。

这不仅会比较所有连续的打印,而且只会在有匹配项时比较打印,因此将忽略唯一的条目

$ awk '{if($2 in a) print $1,a[$2]; else a[$2]=$1}' file

2 1
4 1
1 1
5 3
请注意,
1 1
条目会出现,因为您在输入文件中有两次
1 abc

要交换列,请在if语句中更改为打印[$2],$1。要消除重复条目的自引用,您可以在打印前添加另一个条件
if($2!=a[$1])

awk'{
awk '   {
        if ( ! ( $2 in Ps ) ) Os[++Oi] = $2
        # Line nr reference
        Ps[$2] = Ps[$2] " " NR
        # first field reference
        Ps[$2] = Ps[$2] " " $1
        }
     END {
        for ( i=1; i <= Oi; i++ ) {
           Size = split( Ps[ Os[ i]], aPls)
           for ( j = 2; j <= Size; j++) {
              printf( "%s\t%d\n", aPls[1], aPls[ j])
              }
           }
        }
     ' YourFile
如果(!(每秒2美元))操作系统[++Oi]=2美元 #行参考 Ps[$2]=Ps[$2]”编号 #第一场参考 Ps[$2]=Ps[$2]“”$1 } 结束{
对于(i=1;我也解释了逻辑,很明显,您的输出与输入之间的关系不清楚……如果您试图记录第1列的值,其中第2列是相同的,您可以执行
awk'{dat[$2]=dat[$2]FS$1}END{for(k in dat)print k,dat[k]}“
然后根据需要处理该字符串…3和5不是连续的!您的解释和示例不对应。请提供更多关于输出生成的信息,在1 4之后是1 6(如果信息不是行nr而是第一个字段,则为1 1),以及在这种情况下为什么是3 5而不是3 6