Grep和替补?

时间:2014-07-18 16:57:01

标签: ksh

我必须解析ASCII文件,将相关数据输出到逗号分隔文件并将其加载到数据库表中。

最近更新了文件格式的规格,一节导致了问题。这是该部分的原始布局。

CSVHeaderAttr:PUIS,IdleImmediate,POH,Temp,WorstTemp
CSVValuesAttr:NO,NO,9814,31,56

我用grep解析它

CSVAttributes=$(grep ^CSVValuesAttr:  ${filename}|cut -d':' -f2)
[ -z "$CSVAttributes" ] && CSVAttributes="NA"

它工作得很好,但现在该部分有新字段,并且它们的名称不同

CSVHeaderAttr:PUIS,IdleImmediateSupported,IdleImmediateEnabled,POH,Temp,WorstTemp
CSVValuesAttr:NO,YES,YES,23861,31,51

现在,我正在根据文件的布局(在标题中有一个字段告诉我布局的版本)将两个不同的逗号分隔的文件加载到两个不同的表中。我想将这两个部分输出到同一个文件中,因此数据科学家只有一个表可用于他的分析。

有没有办法使用grep生成这样的输出并用NA替换空字段?

对于一种文件类型:

CSVHeaderAttr:PUIS,IdleImmediate,IdleImmediateSupported,IdleImmediateEnabled,POH,Temp,WorstTemp
CSVValuesAttr:NO,NO,NA,NA,9814,31,56

对于其他文件类型:

CSVHeaderAttr:PUIS,IdleImmediate,IdleImmediateSupported,IdleImmediateEnabled,POH,Temp,WorstTemp
CSVValuesAttr:NO,NA,YES,YES,23861,31,51

感谢您的意见。

1 个答案:

答案 0 :(得分:1)

sed -n '/CSVHeaderAttr:/ c\
CSVHeaderAttr:PUIS,IdleImmediate,IdleImmediateSupported,IdleImmediateEnabled,POH,Temp,WorstTemp
/CSVValuesAttr:/ {
      /\([^,]*,\)\{5\}/ s/\([^,]*,\)/&NA,/
      t p
      s/\(\([^,]*,\)\{2\}\)/\1NA,NA,/
#      t p
: p
   p
   }' AllYourFiles > ConcatFile

使用sed在更改新布局之前测试多少列(/\([^,]*,\)\{5\}/