Awk 得到相同的行

Awk 得到相同的行,awk,Awk,我有这样一个文件:(data.dat) 奇数列是简单行计数器(NR),偶数列是简单值。我想得到那些值,其中第二(或偶数)列的值在所有偶数列中都相同,即我应该得到以下输出: 1 2 3 9 我已经试过了,但有点不对劲: awk '{arr1[$1]=$2;arr2[$3]=$4;arr3[$5]=$6;arr4[$7]=$8;arr5[$9]=$10;arr6[$11]=$12;arr7[$13]=$14;arr8[$15]=$16;}END{for(x in arr1) if(x in arr

我有这样一个文件:(
data.dat

奇数列是简单行计数器(NR),偶数列是简单值。我想得到那些值,其中第二(或偶数)列的值在所有偶数列中都相同,即我应该得到以下输出:

1
2
3
9
我已经试过了,但有点不对劲:

awk '{arr1[$1]=$2;arr2[$3]=$4;arr3[$5]=$6;arr4[$7]=$8;arr5[$9]=$10;arr6[$11]=$12;arr7[$13]=$14;arr8[$15]=$16;}END{for(x in arr1) if(x in arr2 && x in arr3 && x in arr4 && x in arr5 && x in arr6 && x in arr7 && x in arr8) print arr1[x];}' data.dat | sort -n
顺便问一下,有更好的办法吗


更新:真正的问题是数组索引不同。因此,arr[…]方法不起作用…:(

您的示例仅适用于一个简单的示例

awk '{if($2==$4 && $2==$6 && $2==$8 && $2==$10 && $2==$12 && $2==$14 && $2==$16) print $1}' test.txt | sort -n
我还缺少其他要求吗

编辑:显然,您添加了缺少的列:)请尝试

awk'{if(NF>1){found=1;for(i=4;i在输入数据行中#9的所有偶数列都不相同,因此不确定如何在所需的输出中显示9。您可以尝试使用以下awk命令打印任务的第一列:

awk '{same=0; prev=-1; for(i=2;i<=NF;i+=2) {if (prev != -1 && prev != $i) {same=1; break;} else prev=$i;} if (same==0) print $1;}' awk '{same=0; prev=-1; for(i=2;i<=NF;i+=2) {if (prev != -1 && prev != $i) {same=1; break;} else prev=$i;} if (same==0) print $1;}'
awk'{same=0;prev=-1;for(i=2;i这将起作用-

awk '
BEGIN{x=0}
{if (x<NF) x=NF;for (i=2;i<=NF;i+=2) a[$i]++} 
END{x=x/2;for (y in a) if (x==a[y]) print y}' INPUT_FILE
您可以通过管道将输出传输到
sort-n
以使其有序,也可以使用此命令-

awk '
BEGIN{x=0}
{if (x<NF) x=NF;for (i=2;i<=NF;i+=2) a[$i]++} 
END{x=x/2;for (i=1;i<=length(a);i++) if (x==a[i]) print i}' INPUT_FILE
awk'
开始{x=0}

{如果(xWhat's house,output's error or or you get a error?好的,我知道问题的根源是什么:奇数列的行数不同…但是我不知道解决方法…我正在尝试根据此编辑我的问题…不用担心。:)您可以通过管道将结果传送到排序-n以使其有序。更新了解决方案,以便您有两种选择来有序地获得输出。:)祝您好运!!
awk '
BEGIN{x=0}
{if (x<NF) x=NF;for (i=2;i<=NF;i+=2) a[$i]++} 
END{x=x/2;for (y in a) if (x==a[y]) print y}' INPUT_FILE
[jaypal:~/Temp] awk '
BEGIN{x=0}
{if (x<NF) x=NF;for (i=2;i<=NF;i+=2) a[$i]++} 
END{x=x/2;for (y in a) if (x==a[y]) print y}' file
2
3
9
1
awk '
BEGIN{x=0}
{if (x<NF) x=NF;for (i=2;i<=NF;i+=2) a[$i]++} 
END{x=x/2;for (i=1;i<=length(a);i++) if (x==a[i]) print i}' INPUT_FILE