![使用 gawk 根据 CSV 列数据创建文件名](https://linux22.com/image/176700/%E4%BD%BF%E7%94%A8%20gawk%20%E6%A0%B9%E6%8D%AE%20CSV%20%E5%88%97%E6%95%B0%E6%8D%AE%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6%E5%90%8D.png)
我有一个非常混乱的 CSV 文件,其标题如下所示:
maindata.csv
time;area;measurement1;measurement2;measurement3;.....measurement12
我能够使用以下gawk
命令格式根据测量名称分别拆分单个大文件,以便将每个单独的文件保留为以下 CSV 格式:
measurement1.csv -> has csv header [time,area,measurement1]
measurement2.csv -> has csv header [time,area,measurement2]
....
measurement12.csv -> has csv header [time,area,measurement12]
gawk
命令:
gawk -F';' '{print $1","$2","$X}' maindata.csv > /splitdata/measurementX.csv
其中X
是相应测量的列号。
我每次都必须在终端上手动执行此操作,并且想知道我是否真的可以使用某种方式提取测量列名称,gawk
并将上面的命令替换为一些可以自动用于命名文件的变量measurementX.csv
例子
gawk -F';' '{print $1","$2","$3}' maindata.csv | head -n 1 > splitdata/measurement<get the column 3 name here>.csv
聚苯乙烯为简洁起见,列名称为measurementX
.在实践中,它们可以是temperature
、 或pumpmotor
等等。
答案1
measurements.awk
:
BEGIN{FS=";";OFS=","}
{
for (X=3;X<=NF;X++){
if (NR==1){name[X]=$X}
print $1,$2,$X > name[X]".csv"
}
}
请注意,这NR==1
仅适用于标头。因此,我们将测量名称保存在数组中name
,然后继续[time,area,measurement]
在相应的文件中打印每组测量值。
$ gawk -f measurements.awk file
$ cat file
time;area;temperature;pumpmotor;diameter
1;2;3;4;5
6;7;8;9;10
$ cat diameter.csv
time,area,diameter
1,2,5
6,7,10
$ cat temperature.csv
time,area,temperature
1,2,3
6,7,8
$ cat pumpmotor.csv
time,area,pumpmotor
1,2,4
6,7,9