获得相同的行

时间:2012-01-08 10:23:38

标签: awk

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

 1  1            1  1            1  1            1  1            1  1            1  1            1  1            1  1
 2  2            2  2            2  2            2  2            2  2            2  2            2  2            2  2
 3  3            3  3            3  3            3  3            3  3            3  3            3  3            3  3
 4  4            4  4            4  4            4  4            4  4            4  4            4  4            4  7
 5  5            5  5            5  5            5  5            5  5            5  5            5  5            5  9
 6  6            6  6            6  6            6  6            6  6            6  7            6  7           
 7  9            7  7            7  7            7  7            7  7            7  8            7  9         
 8 10            8  9            8  9            8  8            8  8            8  9                       
                 9  11           9  10           9  9            9  9            9  10                      
                10  12          10  11                          10  10          10  11                    

奇数列是简单行计数器(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 [...]方法不起作用...... :(

3 个答案:

答案 0 :(得分:1)

您的示例仅适用于简单;

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<NF+1; i+=2) { if($2!=$i) { found=0; } } } if(found) print $1}' test.txt | sort -n

答案 1 :(得分:1)

这可行 -

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

说明:

  1. 我们在variable x=0声明中设置了BEGIN
  2. 我们使用此variable来查找最大字段数(稍后会有用)。
  3. 我们将每个second column的值存储到数组中并获取它们的出现次数。
  4. 我们将variable x by 2除以验证每个第二列中可能出现的值的最大数量。
  5. 如果数组中出现的数字与此变量匹配,则表示它们出现在每个第二列中。
  6. 测试:使用您的示例文件

    [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
    

    您可以将输出传输到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
    

答案 2 :(得分:0)

在您的输入数据中,第9行没有所有偶数列相同,因此不确定如何在所需输出中显示9。您可以尝试按照awk命令为您的任务打印第一个col:

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;}'