Как использовать sed, cut или awk, чтобы обрезать 10-й столбец до 30 символов по всему миру, но пропуская заголовок, а затем добавить пробел плюс 3 точки? - PullRequest
0 голосов
/ 09 сентября 2018

Ubuntu 16.04
Баш 4.3.3

Вот заголовок и вторая строка файла CSV.

"dealer_Id","vin","stock_id","mileage","year","make","model","body","transmission","engine","drive","interior_color","exterior_color","web_price"
"MP000","3GNCJPSB2KL130000","2190025","3","2019","Chevrolet","Trax","4D Sport Utility","6-Speed Automatic","ECOTEC 1.4L I4 SMPI DOHC Turbocharged VVT","AWD",

Вот мой скрипт sed, который заменит несколько имен заголовков и несколько строк по всему миру. Я могу заменить строки глобально, так как знаю, что они никогда не появятся в именах заголовков.

for feed in *; do
   sed -i '
      s/"stock_id"/"stocknumber"/;
      s/"body"/"bodystyle"/;
      s/"engine","drive"/"enginetext","drive"/;     
      s/"exterior_color"/"color"/;
      s/"interior_color"/"interiorcolor"/;
      s/"web_price"/"price"/;
      s/<b>//g; s/*//g;
      s/\([0-9]\)""/\1inch/g' "$feed"
done;   

Строка заголовка теперь идеальна.

"dealer_Id","vin","stocknumber","mileage","year","make","model","bodystyle","transmission","enginetext","drive",
"MP000","3GNCJPSB2KL130000","2190025","3","2019","Chevrolet","Trax","4D Sport Utility","6-Speed Automatic","ECOTEC 1.4L I4 SMPI DOHC Turbocharged VVT","AWD",

Значения в 10-м столбце довольно длинные:
"ECOTEC 1.4L I4 SMPI DOHC Turbocharged VVT"

Нам нужно обрезать его так, чтобы оно помещалось в заданное пространство внутри приложения без переноса на следующую строку. Таким образом, мы решили, что если 10-й столбец содержит более 34 символов, мы должны укоротить его до 30 символов, а затем добавить пробел и 3 точки в конце, чтобы он выглядел так:
"ECOTEC 1.4L I4 SMPI DOHC Turbo ..."

Я могу обрезать 10-ю колонку глобально, вот так:
sed -r 's/([^,]{0,30})[^,]*/\1/10/g' $feed

но я не уверен, как добавить пробел и 3 точки в конце усеченного текста при пропуске первой строки.

1 Ответ

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

Вот код, который я пробовал для вас:

#!/bin/bash
a=`awk -F',' '{print $5}' test.csv | tr -d '"' | cut -b -10`;
b='"'$a' ..."';
z="$(awk -F,  -v fcol="$b" '{print $1,$2,$3,$4,$5=fcol,$6}' OFS=, test.csv)"
echo "$z" > someotherfile.csv

Это даст вам вывод как "one","two","three","four","fivefivefi ...","six",.

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