タブ区切りのテキストファイルから重複した値を削除する方法

タブ区切りのテキストファイルから重複した値を削除する方法

以下のようにタブ区切りの列テキストがあります。

A      B1      B1     C1
B      B2      D2 
C      C12     C13    C13
D      D3      D5      D9
G      F2      F2   

上記の表を次のように変換するにはどうすればよいですか?

A      B1     C1
B      B2     D2 
C      C12    C13
D      D3     D5     D9
G      F2   

実際のデータファイルを抽出しました。タブ区切りファイルです。あなた(Stéphane Chazelas?)が投稿したコマンドラインを試してみましたが、うまくいきますが、最後の列の重複エントリを削除できませんでした。

A  CD274    PDCD1LG2  CD276   PDCD1LG2  CD274
B  NEK2     NEK6      NEK10   NEK10     NEKL-4
C  TNFAIP3  OTUD7B    OTUD7B  TNFAIP3   TNFAIP3
D  DUSP16   DUSP4     DUSP8   VHP-1     DUSP8
E  AGO2     AGO2      AGO2    AGO2      AGO2

出力は次のようにする必要があります

A  CD274    CD276   PDCD1LG2
B  NEK2     NEK6    NEK10     NEKL-4
C  TNFAIP3  OTUD7B
D  DUSP16   DUSP4   DUSP8     VHP-1
E  AGO2

ベストアンサー1

最初のサンプルデータセット:

$ awk -vOFS='\t' '{ r=""; delete t; for (i=1;i<=NF;++i) { if (!t[$i]++) { r = r ? r OFS $i : $i } } print r }' file
A       B1      C1
B       B2      D2
C       C12     C13
D       D3      D5      D9
G       F2

2番目のサンプルデータセット(同じawkスクリプト):

$ awk -vOFS='\t' '{ r=""; delete t; for (i=1;i<=NF;++i) { if (!t[$i]++) { r = r ? r OFS $i : $i } } print r }' file
A       CD274   PDCD1LG2        CD276
B       NEK2    NEK6    NEK10   NEKL-4
C       TNFAIP3 OTUD7B
D       DUSP16  DUSP4   DUSP8   VHP-1
E       AGO2

スクリプトは入力ファイルを1行ずつ読み取り、各行ごとfileに各フィールドを繰り返して出力行を作成しますr。フィールドの値が出力行に追加されている場合(t使用されたフィールド値のルックアップテーブルによって決まります)の場合、そのフィールドは無視され、それ以外の場合は追加されます。

入力行のすべてのフィールドが処理されると、構成された行が出力されます。

-vOFS='\t'出力フィールド区切り文字はコマンドラインのタブに設定されます。


公開スクリプトawk

{
    r = ""
    delete t

    for (i = 1; i <= NF; ++i) {
        if (!t[$i]++) {
            r = r ? r OFS $i : $i
        }
    }

    print r
}

おすすめ記事