Обработка текста для создания списка уникальных идентификаторов - PullRequest
0 голосов
/ 18 октября 2018

У меня есть файл с идентификаторами и именами, применимыми к ним, как показано ниже:

1234|abc|cde|fgh
5678|ijk|abc|lmn
9101|cde|fgh|klm
1213|klm|abc|cde

Мне нужен файл с только уникальными именами в виде списка.

Выходной файл:

abc|sysdate
cde|sysdate
fgh|sysdate
ijk|sysdate
lmn|sysdate
klm|sysdate

Где sysdate - текущая временная метка обработки.

Запрос помощи в этом.Также запрашивать объяснение предложенного кода.

1 Ответ

0 голосов
/ 18 октября 2018

Что делает этот код:

awk -F\| '{ for(i=2; i <= NF; i++) a[$i] = a[$i] FS $1 }' input.csv

-F устанавливает разделитель на |, awk обрабатывает ваш файл построчно, создает карту с именем «a», читает из столбца 2 до конца и заполняеткарта, использующая текущую ячейку, обработанную как ключ, и текущую ячейку + разделитель файлов + значение в первом столбце в качестве значения.

Когда awk заканчивает обработку первой строки, 'a' имеет вид:

a['abc'] = 'abc|1234'
a['cde'] = 'cde|1234'
a['fgh'] = 'fgh|1234'

Этот скрипт ничего не печатает.

То, что вы хотите, выглядит примерно так:

awk -F'|' '{for(i=2;i<=NF;i++){if(seen[$i] != 1){print $i, strftime(); seen[$i]=1}}}' OFS='|' input.csv

-F устанавливает входной разделитель на |, OFS делает то же самое для выходного разделителя,Для каждого значения от столбца 2 до конца строки мы проверяем, было ли оно уже замечено ранее.Если нет, мы печатаем значение и время процесса.Затем мы регистрируем значение на карте, чтобы избежать повторной обработки.

Вывод:

abc|Thu Oct 18 10:40:13 CEST 2018
cde|Thu Oct 18 10:40:13 CEST 2018
fgh|Thu Oct 18 10:40:13 CEST 2018
ijk|Thu Oct 18 10:40:13 CEST 2018
lmn|Thu Oct 18 10:40:13 CEST 2018
klm|Thu Oct 18 10:40:13 CEST 2018

Вы можете изменить формат sysdate.Смотри документацию gawk strftime здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...