以下のようにタブ区切りの列テキストがあります。
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
}