重新格式化文件以加载到数据库中。 文件的详细信息在代码下面给出。
到目前为止我有什么。 除了计算时间外,一切都有效。
awk 'BEGIN{ FS="|" ; OFS="\t" };
{ for (i = 4; i < NF; i=i+2 ) {
# +2 Because need to walk row in pairs of QC/Value(s)
if ( NF == 52 ) {
hour = (i - 2)/2
# Need the value of i, not what is stored in position i.
qualitycode = i
value = i + 1
print ( $1,$2,$3,$hour,$qualitycode,$value )
} else {
print ( "ERROR",$NR,$0 )
}
}
}' $origfile > $tempfile
cat $tempfile | grep ERROR > $errfile
cat $tempfile | grep -v ERROR > $newfile
如何获取 i的值而不是“i”位置存储的值?
如果您有兴趣。
原始数据文件采用以下格式:
Module|Sensor|Date|QC1|Value1|QC2|Value2|QC3|Value3|......|QC23|Value23|QC24|Value24|
90123|PQRST|20161015|4|12.45|4|11.23|4|10.40|4|9.89|......|4|21.36|4|20.55|
65432|BCDEF|20161015|4|6.45|4|7.51|2|9.01|4|11.74|.....|4|18.92|4|16.4|
.....many more rows
有多个模块,每个模块都有多个传感器。
想要重新格式化以加载到数据库中:
Module\tSensor\tDate\tHour\tQC1\tValue1
Module\tSensor\tDate\tHour\tQC2\tValue2
Module\tSensor\tDate\tHour\tQC24\tValue24
每个模块/传感器/日当然需要从1增加到24小时?
答案 0 :(得分:1)
我认为你在印刷声明中犯了一个错误:
print $hour
这将以小时为单位取消引用该值,获取hour
中存储的位置中字段的值,而
print hour
将在变量hour
中打印实际值。
答案 1 :(得分:0)
尝试更改代码中的以下内容:
print $1,$2,$3,hour,qualitycode,value )
} else {
print "ERROR",NR,$0
在awk中,我们无法打印像shell这样的变量值。
答案 2 :(得分:0)
awk -F'|' -vOFS='\t' '{
d=(NF-4)/2; j=3
for (i=1; i<=d; ++i) {
print $1,$2,$3,i,"QC" i, $(j+=2)
}
}' "$origfile" > "$tempfile"