如何使用sed,cut或awk将第10列全局修剪为30个字符,但是跳过标题,然后添加空格加3个点?

时间:2018-09-09 18:15:32

标签: bash sed

Ubuntu 16.04
Bash 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 ..."

我可以像这样全局修剪第十栏:
sed -r 's/([^,]{0,30})[^,]*/\1/10/g' $feed

但是我不确定如何在跳过第一行时在截断的文本末尾添加空格和3个点。

1 个答案:

答案 0 :(得分:1)

这是我为您尝试的代码:

#!/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",的输出。