根据文件名向 CSV 数据中添加额外值

Adding an extra value into CSV data, according to filename

假设我有以下类型的文件名格式: CO#ATH2000.dat , CO#MAR2000.dat

其中每一个都有如下数据:

....   
"12-02-1984",3.8,4.1,3.8,3.8,3.8,3.7,4.1,4.3,3.8,4.1,5.0,4.8,4.5,4.3,4.3,4.3,4.1,4.5,4.3,4.3,4.3,4.5,4.3,4.1
"13-02-1984",3.7,4.3,4.3,4.3,4.1,4.3,4.5,4.8,4.8,5.0,5.2,5.0,5.2,5.2,5.2,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.5,4.3
"14-02-1984",3.8,4.1,3.8,3.8,3.8,3.8,3.8,4.2,4.5,4.5,4.1,3.6,3.6,3.4,3.4,3.2,3.4,3.2,3.2,3.2,2.9,2.7,2.5,2.2
"15-02-1984",2.2,2.2,2.0,2.0,2.0,1.8,2.1,2.6,2.6,2.5,2.4,2.4,2.4,2.5,2.7,2.7,2.6,2.6,2.7,2.6,2.8,2.8,2.8,2.8
..........

现在我还有以下 .sh 文件,可以将所有这些 .dat 文件合并到一个输出 .dat 文件中。

for filename in `ls CO#*`; do
    cat $filename >> CO#combined.dat
done  

问题来了。我希望在 CO#combined.dat 的每一行中,在值开始之前,根据 filename 参数有一个 'standard' 值。例如,我希望每个文件名中带有 ATH 的文件在每一行的开头都有 3,,文件名中带有 MAR 的文件有 22,.

所以 CO#combined.dat 应该是这样的:

....   
3,"12-02-1984",3.8,4.1,3.8,3.8,3.8,3.7,4.1,4.3,3.8,4.1,5.0,4.8,4.5,4.3,4.3,4.3,4.1,4.5,4.3,4.3,4.3,4.5,4.3,4.1
3,"13-02-1984",3.7,4.3,4.3,4.3,4.1,4.3,4.5,4.8,4.8,5.0,5.2,5.0,5.2,5.2,5.2,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.5,4.3
20,"14-02-1984",3.8,4.1,3.8,3.8,3.8,3.8,3.8,4.2,4.5,4.5,4.1,3.6,3.6,3.4,3.4,3.2,3.4,3.2,3.2,3.2,2.9,2.7,2.5,2.2
20,"15-02-1984",2.2,2.2,2.0,2.0,2.0,1.8,2.1,2.6,2.6,2.5,2.4,2.4,2.4,2.5,2.7,2.7,2.6,2.6,2.7,2.6,2.8,2.8,2.8,2.8
..........

所以总而言之,我希望脚本执行上述过程!

提前致谢!

使用 awk,您可以利用内置的 FILENAME 变量以及可以为给定调用提供多个文件的事实。 awk 依次处理每个文件,将 FILENAME 设置为当前正在读取其记录的文件的名称。

有了它,您可以根据您希望在文件名中搜索的任何模式来设置前缀。终于可以打印前缀和原始记录了。

下面是示例输入的简化版本演示:

$ cat CO\#ATH2000.dat 
1
2
3

$ cat CO\#MAR2000.dat
A
B
C

$ awk 'FILENAME ~ /MAR/ {pre=22} FILENAME ~ /ATH/ {pre=3} { print pre "," [=10=] }' CO*.dat
3,1
3,2
3,3
22,A
22,B
22,C

简单易行

for f in CO#*; do 
      case ${f:3:3} in 
          ATH) k=3 ;; 
          *) k=22 ;; 
      esac; 
      sed "s/^/$k,/" $f >> all; 
done

${f:3:3} 从文件名中提取代码 ATH 或 MAR 它是 bash 子字符串函数; case 将代码转换为对应的数字; sed 在每行的开头插入数值和逗号。