BEGIN { FS = "," }
FNR == NR {
if (seen[$2,$3,$4])
delete lines[seen[$2,$3,$4]]
lines[FNR]
seen[$2,$3,$4] = FNR
next
}
FNR in lines
Эта awk
программа предполагает дважды прочитать один и тот же файл. При первом чтении файла выполняется только блок FNR == NR
. Это запоминает, как ключи в массиве lines
, какие номера строк выводить. Если строка с определенной комбинацией 2-го, 3-го и 4-го столбцов уже была просмотрена, номер самой последней строки вставляется в качестве ключа, а предыдущий удаляется (оператором delete
.
Во время второго синтаксического анализа файла происходит только поиск текущего номера строки в массиве lines
. Если он найден, строка печатается.
Пример запуска с «одной -лайнером» версии того же кода:
$ awk -F, 'FNR==NR { if(s[$2,$3,$4]) delete l[s[$2,$3,$4]]; l[FNR]; s[$2,$3,$4]=FNR; next}; FNR in l' file file
"2018-12-07 23:29:05",DD,11,AAA,250,REMOVED
"2018-12-07 23:30:00",CH,00,UUU,250,REMOVED
"2018-12-07 23:31:45",MM,33,OOO,250,REMOVED
"2018-12-07 23:46:41",XX,99,ZZZ,250,REMOVED
Explicitly setting the disposition of SIGCHLD to SIG_IGN causes any child process that subsequently terminates to be immediately removed from the system instead of being converted into a zombie.
Расположение по умолчанию приводит к тому, что дочерние процессы становятся зомби при выходе до тех пор, пока не будет получен их статус выхода. Установка SIGCHLD
на SIG_IGN
указывает, что родительский не заботится о своих дочерних кодах выхода, и они пожинаются сразу при выходе.