我想使用 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