Что делает этот код:
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 здесь