Первый набор примерных данных:
$ 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
Второй набор примеров данных (тот же 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
Сценарий считывает входной файл 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
}