Shell 脚本 - 读取 CSV 文件行并为单元格中的多个值添加前缀

Shell 脚本 - 读取 CSV 文件行并为单元格中的多个值添加前缀

我有一个这样的 csv 文件。

aaa|c1|bbb|t1
bbb|c1,c2|nnn|t1,t2

管道是分隔符。我想生成一个包含第 2 列和第 4 列的字符串。并且我需要为两个列值添加前缀。

列 2 =a是前缀 列 4 =b是前缀

预期输出:

this is final string a.c1=b.t1
this is final string a.c1,a.c2=-b.t1,b,t2

我的示例脚本(完整):

while read r_line
do
c2 = $(echo $r_line|awk -F'|' '{print $2}')
c4 = $(echo $r_file |awk -F'|' '{print $4}')
out=$("this is final string a.$c2=b.$c4")
done < csv file

在这里,如果 c2 或 t2 具有逗号分隔值,我需要为这两个值应用前缀。

答案1

bash您可以通过将 csv 文件读入数组,然后通过首先在其中进行参数替换来输出第二个第四个字段来完成这一切

while IFS='|' read -ra a;do
  echo This is the final string: \
    "a.${a[1]//,/,a.}=b.${a[3]//,/,b.}"
done < csvfile

答案2

使用 sed 的方法。

prefix1=a.
prefix2=b.
while read r_line; do
    c2=$(echo $r_line | cut -d'|' -f2)
    c4=$(echo $r_line | cut -d'|' -f4)
    s1=$(echo $c2 | sed "s/,/,$prefix1/g" | sed "s/^/$prefix1/g")
    s2=$(echo $c4 | sed "s/,/,$prefix2/g" | sed "s/^/$prefix2/g")
    echo "this is final string $s1=$s2"
done

脚本搜索,并代替,$prefix并最后添加$prefix在头部。我喜欢用它cut来分割字符串。

答案3

您可以读取每一行,使用它cut来获取每个字段及其用途sed

while read -r line; do
a="$(cut -d'|' -f2 <<<"$line")"
b="$(cut -d'|' -f4 <<<"$line")"
a="$(echo "$a"|sed -e 's/^/a./' -e 's/,/,a./g')"
b="$(echo "$b"|sed -e 's/^/b./' -e 's/,/,b./g')"
echo "this is final string $a=$b"
done < csv_file 

答案4

完整的 awk 解决方案

awk 文件 (se.awk )

BEGIN { FS="|" }
{
  a="" ; n=split($2,A,",") ; for (i=1;i<=n;i++) a = a ",a." A[i] ;
  b="" ; n=split($4,B,",") ; for (i=1;i<=n;i++) b = b ",b." B[i] ;
  printf "%s %s=%s\n",prefix,substr(a,2),substr(b,2) ;
}

称为

awk -v prefix="this is final string" -f se.awk c
this is final string a.c1=b.t1
this is final string a.c1,a.c2=b.t1,b.t2

在哪里

  • -v prefix="this is final string"prefix在命令行中 设置 var
  • BEGIN { FS="|" }告诉 awk 用作|分隔符
  • a="" ; n=split($2,A,",")分割第二个字段,并计数
  • for (i=1;i<=n;i++) a = a ",a." A[i] 使用前导不需要的逗号构建预期的字符串
  • (第四个位置的 b 也是如此)
  • prefix="this is final string" 使用 printf 组装字符串,去除逗号

如果前缀是固定的,可以在awk程序中插入

BEGIN { 
  FS="|" ;
  prefix="this is prefix" ; 
}

相关内容