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