다음과 같은 헤더가 포함된 매우 지저분한 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