列の値が等しくない場合、その行のみを印刷する方法は?

列の値が等しくない場合、その行のみを印刷する方法は?

遺伝子型計算用の大容量入力ファイルがあります。最初の数行は次のとおりです。

LocusID f nAlleles x y
2L:8347 1 2 44.3166 -12.2373
2L:8347 1 2 39.2667 -6.8333
2L:31184 1 2 39.2667 -6.8333
2L:31184 1 2 39.2667 -6.8333
2L:42788 1 2 39.2667 -6.8333
2L:42788 1 2 39.2667 -6.8333
2L:42887 1 2 39.2667 -6.8333
2L:42887 1 2 39.2667 -6.8333

最初の列はサイトIDであり、各サイトに同じサイトIDを持つ2行があります。 x列とy列は、各軌跡に対して資格のない列だけを維持したいと思います。

これは上記の例で私が望む結果です。

out
2L:8347 1 2 44.3166 -12.2373
2L:8347 1 2 39.2667 -6.8333

どうすればいいのかご存知ですか?

ベストアンサー1

$ cat tst.awk
NR == 1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
    next
}
NR % 2 {
    split(prev,p)
    if ( ( p[f["x"]] != $(f["x"]) ) || ( p[f["y"]] != $(f["y"]) ) ) {
        print prev
        print
    }
}
{ prev = $0 }

$ awk -f tst.awk file
2L:8347 1 2 44.3166 -12.2373
2L:8347 1 2 39.2667 -6.8333

おすすめ記事