Разбор и внесение изменений в содержимое файла - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть приложение, которое генерирует файлы, содержащие различные строки данных, разделенные запятой (,).

Например:

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

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Сделайте это в два шага,

  1. Для строк, которые не содержат $4 как VER, вставьте , перед фактическим $4.Поскольку , здесь является разделителем полей ввода и вывода, нельзя использовать FS напрямую
  2. Для всех строк в столбце даты, т. Е. На $6, используйте split()на . и распечатайте деталь без 000

    awk 'function splitdate(var) {
             n=split(var,a,".")
             return a[1] 
         } 
         BEGIN{ FS=OFS="," } 
         NR>1 && $4 !~ /VER/{ $4=","$4; $5=splitdate($5); print; next }
         { $6=splitdate($6) }1' file
    
0 голосов
/ 28 сентября 2018

Вы можете использовать это awk:

awk 'BEGIN{FS=OFS=","} NR>1 && NF<8 && $4 !~ /VER$/{$4 = OFS $4}
     {sub(/\.[0-9]{3},/, ",")} 1' file

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
0 голосов
/ 28 сентября 2018

я тестировал нормально GNU Awk 3.1.7

awk -F, 'BEGIN {OFS=","}{if ($4 !~ /VER/) $4=","$4;}{print $0}' temp|awk -F, 'BEGIN {OFS=","}{$6=substr($6,0,19)}{print}'
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...