我需要编写一个 Linux 程序,它从 csv 文件读取部分数据并按以下模式写入文本文件。
NAME : FROM= -100 -346 -249 -125 TO= -346 -249 -125 100 COLOR= COLOR1 COLOR2 COLOR3 COLOR4
NAME 将是一个固定行,
FROM 和 TO 信息应从 csv 文件中检索,并且
颜色信息可以是来自程序本身的硬编码颜色数组。
从下面的 csv 数据中,MIN 下的第一个值(-100)将是文本文件的 FROM 下的第一个值(-100)。 Excel MAX 列中的最后一个值 (100) 将是文本文件 TO 列下的最后一个值 (100)。 Excel 中 VALUE 列下的值将四舍五入并用作每个所示模式的 TO 和 FROM。
数据,值, 100,-345.8756, 200,-249.3654, 300,-125.3554, 计数、最小值、最大值 1,-100,-98 93,84,86 98,94,96 99,96,98 100,98,100
答案1
awk解决方案(针对您当前的输入文件):
awk 'NR>1 && NR<5{
v=sprintf("%.0f", $2); values=(values)? values FS v : v;
lbl="COLOR"; col_item=lbl""++c; col=(col)? col OFS col_item : col_item
}
NR==6{ from=$2 }
END{
print "NAME :"; print "FROM=",from,values;
print "TO=",values,$3; print "COLOR=",col,lbl""++c
}' file
输出:
NAME :
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4
答案2
一个awk
程序:
BEGIN { FS = ","; col = "COLOR1"; i = 1 }
!/^[0-9]/ { next }
$3 == "" {
val = sprintf("%.0f", $2)
data = data ? data OFS val : val
col = col OFS "COLOR" ++i
next
}
$2 < min { min = $2 }
$3 > max { max = $3 }
END {
printf("NAME:\nFROM= %s %s\nTO= %s %s\nCOLOR= %s\n",
min, data, data, max, col)
}
测试它:
$ awk -f script.awk file.csv
NAME:
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4
我假设文件的第一部分和第二部分中可能有更多的数据行(但不是列),并且行COLOR
上的条目数应该COLOR
与文件中的数据值FROM
和TO
行数一样多。输出。
块会跳过非数字行!/^[0-9]/
。
输出中重复的数据由第三个块 ( ) 拾取$3 == ""
。该块创建一个data
和 一个col
具有适当值的字符串。使用sprintf()
指定不带小数位的浮点数的格式执行舍入。
最小值和最大值是从输入文件的后面部分中选取的,作为第二列的最小值和第三列的最大值。
该END
块打印出结果报告。