У меня есть приложение, которое генерирует файлы, содержащие различные строки данных, разделенные запятой (,).
Например:
hostname,file_name,type,status,size(b),date,owner(user),owner(group)
server1,/var,dir,ACT_VER,29987,2007-12-03 15:52:43.000,root,root
server2,/DATA_File.out,file,ACT_VER,299076487,2008-10-15 05:12:23.000,marcos,root
server3,/opt,dir,29987,2009-05-03 00:13:23.000,user1,group1
server4,/var/tmp/xxz.zip,file,MOD_VER,400,2007-12-03 15:52:43.000,root,root
server1,/usr,dir,34299876,2006-12-03 15:52:43.000,root,root
server3,/local/home,dir,MOD_VER,400,2009-05-03 00:13:23.000,user2,group1
Ожидаемый вывод:
hostname,file_name,type,status,size(b),date,owner(user),owner(group)
server1,/var,dir,ACT_VER,29987,2007-12-03 15:52:43,root,root
server2,/DATA_File.out,file,ACT_VER,299076487,2008-10-15 05:12:23,marcos,root
server3,/opt,dir,,29987,2009-05-03 00:13:23,user1,group1
server4,/var/tmp/xxz.zip,file,MOD_VER,400,2007-12-03 15:52:43,root,root
server1,/usr,dir,,34299876,2006-12-03 15:52:43,root,root
server3,/local/home,dir,MOD_VER,400,2009-05-03 00:13:23,user2,group1
1-й запрос: иногда файл пропускает информацию в 4-м столбце status
, которая может быть ACT_VER
, MOD_VER
, TCH_VER
или CRT_VER
.Я хочу добавить дополнительную запятую (,) в файл, где отсутствует status
.
2-й запрос: данные в столбце date
находятся в `ГГГГ-ММ-ДД ЧЧ: ММ: СС.MsMs (Ms = миллисекунда).Я хочу игнорировать миллисекунды.
Я ищу что-то в awk (что-нибудь еще) для выполнения обоих задач, что облегчает обработку, поскольку код должен анализировать миллионы строк.
Для первого запроса я попробовал это (и несколько вариантов этого), который не работал
cat file | awk -F, 'BEGIN {OFS=","}{if ($4 !~ /VER/) $4=",$4";}{print $0}'
Я еще не начал работать над вторым запросом.
Я также былинтересно, стоит ли мне помещать весь файл в массив и обрабатывать 4-й элемент, чтобы он содержал лишнюю запятую (,), когда отсутствует *VER*
, и удаляю .000
в 6-м элементе.
Не уверен, какой именнобудет менее трудоемким.
Я использую сценарий оболочки на ОС RHEL 6.7