Добавление значения рядом с последним полем csv-файла в каждую запись с помощью команды sed в unix - PullRequest
0 голосов
/ 02 мая 2019

У меня проблемы с написанием команды sed для добавления значения к каждой записи в виде нового поля рядом с последним столбцом (иногда значения равны нулю) в файле csv с помощью команды sed.

ДляНиже приведен пример моих CSV-данных (с несколькими последними полями и несколькими записями).Мне нужно добавить новое значение в заголовке после поля «ShipFromStore» для каждой записи файла.

Пример ввода (впереди есть поля, но скопированы только некоторые из них, заканчивающиеся на :

Allocation%  ValidityFrom     ValidityTo    CODsurcharge    ShipFromStore 
22           1/10/2017        9/30/2019       4.5   
22           1/10/2017        9/30/2019       4.5   
22           1/10/2017        9/30/2019       4.5   

Желание вывода :

Allocation% ValidityFrom ValidityTo CODsurcharge ShipFromStore NewField
22          1/10/2017    9/30/2019        4.5                    160
22          1/10/2017    9/30/2019        4.5                    160 
22          1/10/2017    9/30/2019        4.5                    160

Значения ShipFromStore на данный момент равны нулю, но в будущем мы могли бы получать данные

Пробовать по командам ниже, но не может их достичь.

sed 'N;s/","/",'160',"/77' Filename
#77 being the position after which the value is to be added
sed 's/$/\,'160'/' Filename
sed '1{s/$/,"Batch_Id"/;b};s/$/,'"$c"'/' Filename

Ответы [ 3 ]

0 голосов
/ 02 мая 2019

попробуйте этот код, вы измените разделитель на ';'если ваш csv не использует ','

awk -v Separator=',' '
   BEGIN{FS=OFS=Separator}
   {
   if(NR>1) $0 = $0 ( (NF == 3 ) ? OFS OFS : OFS ) OFS "160"
     $0 = $0 OFS "\042ShipFromStore\"" OFS "\042NewField\042"
   print
   }
   ' FileName
0 голосов
/ 02 мая 2019

еще awk

$ awk -F, 'BEGIN {OFS=FS} 
           NR==1 {n=NF; print $0, "NewField"} 
           NR>1  {NF=n; print $0, 160}' file.csv 

Allocation%,ValidityFrom,ValidityTo,CODsurcharge,ShipFromStore,NewField
22,1/10/2017,9/30/2019,4.5,,160
22,1/10/2017,9/30/2019,4.5,,160
22,1/10/2017,9/30/2019,4.5,,160

можно переписать короче

$ awk -F, 'BEGIN{OFS=FS} !n{n=NF} {NF=n; print $0, (NR==1?"NewField":160)}' file.csv
0 голосов
/ 02 мая 2019

Ваш Input_file отличается от того, что вы упомянули в ваших комментариях, поэтому я считаю, что у вас есть Input_file, разделенный запятыми, и у вас есть , в конце каждой строки, если это так, попробуйте выполнить следующее.

awk 'BEGIN{s1="\"";FS=OFS=","} FNR==1{print $0 "NewField";next} {$0=$0 OFS s1 " "s1 OFS "160"} 1' Input_file

В случае, если вы хотите сохранить вывод в сам файл Input_file, попробуйте (Делайте это только тогда, когда вы довольны приведенной выше командой, поскольку она выполняет изменения в самом файле Input_file):

awk 'BEGIN{s1="\"";FS=OFS=","} FNR==1{print $0 "NewField";next} {$0=$0 OFS s1 " "s1 OFS "160"} 1'Input_file > temp && mv temp  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...