Csv

使用 gawk 根據 CSV 列數據創建文件名

  • July 9, 2020

我有一個非常混亂的 CS​​V 文件,其中標題如下所示:

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

PS為簡潔起見,列名是measurementX. 在實踐中,它們可以是temperature,或pumpmotor等等。

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

引用自:https://unix.stackexchange.com/questions/597593