В файле CSV я хочу вырезать первые 5 символов из 10 символов из 3-го столбца файла в UNIX - PullRequest
0 голосов
/ 08 марта 2019

Содержимое входного файла

abcde,12345,fedefg12345,aaaaaaa  
abcde,12785,feeefg12345,aaaaaaa  
abcde,12845,fezefg12345,aaaaaaa  
abcde,12995,femefg12345,aaaaaaa   

В файле CSV я хочу вырезать первые 5 символов из 10 символов из 3-го столбца файла в UNIX.Примечание: - Изменения должны быть отражены в самом файле.

Ожидается ВЫХОД: -

abcde,12345,12345,aaaaaaa  
abcde,12785,12345,aaaaaaa  
abcde,12845,12345,aaaaaaa  
abcde,12995,12345,aaaaaaa  

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Легко с Perl и Текст :: CSV_XS :

perl -MText::CSV_XS=csv -we 'csv(in    => shift,
                                 on_in => sub { substr $_[1][2], 0, 6, "" }
                             )' -- file.csv

См. Также substr .

0 голосов
/ 08 марта 2019
awk -F, '{sub(/.{6}/,"",$3)}1' OFS="," file

abcde,12345,12345,aaaaaaa  
abcde,12785,12345,aaaaaaa  
abcde,12845,12345,aaaaaaa  
abcde,12995,12345,aaaaaaa
0 голосов
/ 08 марта 2019

Вы можете сделать это довольно просто с помощью awk, и это substr команда обработки строк, например,

$ awk -F, -v OFS=',' '{$3 = substr ($3, 7)} 1' file
abcde,12345,12345,aaaaaaa
abcde,12785,12345,aaaaaaa
abcde,12845,12345,aaaaaaa
abcde,12995,12345,aaaaaaa

Где -F, устанавливает разделитель полей на ',' и OFS ( выходной разделитель полей ) для ','.

Пояснение

  • -F, -v OFS=',' установите разделитель полей и выходной разделитель полей на comma.
  • {$3 = substr ($3, 7)} удалите первые 6 символов (сохранить подстроку, начинающуюся ссимвол 7) из 3-го поля, заменив 3-е поле подстрокой.
  • 1 выведите все поля с указанными разделителями.

Если поместить его полностью, это простой способпарсинг файла .csv.

примечание: , если количество символов в 3-м поле может варьироваться и вам нужны только последние 5 независимо от номера, тогда вы можете использовать length() функция для получения индекса последнего символа (и вычитания 4 для печати последнего 5), например,

$ awk -F, -v OFS=',' '{$3 = substr ($3, length($3) - 4)} 1' file
<same output>

Запрошенное редактирование на основе 7-го символа в 3-м поле == 0

Помните, что в отличие от C, индексы awk начинаются с 1 вместо 0.Поэтому, если вы хотите проверить, является ли 1-й символ из последних 5 показанных 0, вам необходимо проверить 7-й символ.Вы можете сделать это с помощью другого substr и затем троичного оператора , например,

Новый файл данных примера

$ cat file
abcde,12345,fedefg12345,aaaaaaa
abcde,12785,feeefg12345,aaaaaaa
abcde,12845,fezefg12345,aaaaaaa
abcde,12995,femefg12345,aaaaaaa
abcde,13001,femefg02345,aaaaaaa

(последнийстрока содержит ваше условие)

Пример использования / Вывод

$ awk -F, -v OFS=',' '{$3 = substr($3,length($3)-(substr($3,7,1)==0?3:4))} 1' file
abcde,12345,12345,aaaaaaa
abcde,12785,12345,aaaaaaa
abcde,12845,12345,aaaaaaa
abcde,12995,12345,aaaaaaa
abcde,13001,2345,aaaaaaa

(я убрал пробелы, чтобы предотвратить перенос или прокрутку строки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...