在 csv 文件中添加新列

在 csv 文件中添加新列

我想使用 bash 脚本在 csv 文件的开头附加两个新列,使文件名的前四个字母是第一列的值,接下来的两个字母是第二列的值。例如,如果我的 .csv 文件名是“exam_20”,我希望有一个新的第一列,其中所有条目为“exam”,一个新的第二列,其中所有条目为“20”。有谁知道如何在 bash 中实现这一点?提前致谢。

答案1

awk

#!/usr/bin/awk -f

BEGIN { OFS="," };

FNR==1 {
  split(FILENAME,c,/[_.]/);
};

{ print c[1], c[2], $0 }

或者作为单行代码在命令行上运行或嵌入到 shell 脚本中:

awk -v OFS=',' 'FNR==1 {split(FILENAME,c,/[_.]/)}; {print c[1],c[2],$0}' *.csv

对于每个输入文件,这会将每个 FILENAME 拆分为一个 array c,使用字符类[_.]作为字段分隔符。数组的字段 1 和 2c被添加到文件的每一行之前。

输出示例:

$ ./zsha.awk exam_20.csv 
exam,20,1,2,3,4
exam,20,5,6,7,8
exam,20,9,10,11,12

示例中使用的输入数据为:

$ cat exam_20.csv 
1,2,3,4
5,6,7,8
9,10,11,12

答案2

此代码应该使用 sed 来完成此操作,将其保存为可执行文件,并使用源文件的完整路径作为第一个(也是唯一的)参数来运行。如果您愿意,可以将输出保存到新文件中。

#!/bin/bash
FILE=$1
# check the file exists
[[ -s $FILE ]] || { echo "Can't locate file '$FILE', aborting" >&2; exit 1; }
# get the filename without directory
NAME=$(basename "$1")
# get the first 4 characters as FIRST
FIRST=${NAME:0:4}
# get the 6th & 7th characters as SECOND
SECOND=${NAME:5:2}
# are we good to go?
read -t30 -p "About to prefix '$FIRST,$SECOND,' to all lines in $FILE - ok (y/-): "
[[ $REPLY == "y" ]] || { echo "No changes made"; exit 0; }
# do it
sed "s/^/$FIRST,$SECOND,/" "$FILE"
exit 0

文件 exam_02:

line1,some,stuff
line2,some,more,stuff

输出:

exam,02,line1,some,stuff
exam,02,line2,some,more,stuff

相关内容