根据文件名向 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 在每行的开头插入数值和逗号。
假设我有以下类型的文件名格式:
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 在每行的开头插入数值和逗号。