如何修复dat文件中的列长度并将其转换为csv文件

时间:2013-11-15 13:32:33

标签: unix awk special-characters fixed-length-record

我的要求是删除unix中的特殊字符和多个连续空格,并将文件转换为csv文件。我能够实现上面的东西但我的问题是我的输出csv文件列长度不同于表列长度。我需要在删除特殊字符和空格后修剪列,所以在bcp输出数据之前我无法在视图中执行此操作。

我需要在unix中处理这个问题

以下是我正在使用的命令

bcp master..STTV_CSTDL out temp.dat -Sdev1 -Udbo -Pdbo1 -b1000 -c -t'123456789'

awk '{gsub(/[[:punct:]]/," ")}1' temp.dat > temp2.dat

sed -e 's/  */ /g' temp2.dat > temp3.dat

直到这一步,我能够在删除特殊字符后实现干净的数据,但在此之后我需要设置列长度

我有25个列,其中 column3 - 10 char(数据最多为20个字符) column5 - 19 char(数据最多为35个字符) column19 - 21 char(数据最多包含19个字符。因此最后应附加3个空格。)

为此,我也尝试了以下命令,但它没有按预期工作

awk 'BEGIN {F="123456789" };
{
printf ("%-12s%-1s%-10s%-1s%-19s%-8s%-4s%-9s%-1s%-1s%-8s%-10s%-1s%-19s%-25s%-22s%-2s%-9s%-1s%-1s%-s%-s%-s%-s%-s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25)}' temp3.dat > temp4.dat 

在某些行中使用此命令后,记录将转移到下一列,文件完全重叠。请帮助我,我为此奋斗了2天。

样本输入和所需输出

INPUT
606322089~ ~CHRISTINAITYREW~E~MARCHETTO                          ~00210816~0000~ ~ ~ ~ ~ ~ ~ ~AD   DR    ADDRESSAD   DR    ADDRESS           U~CINCINNATI         ~OH~452060000~ ~ ~SECOSXSDS ND SAMPLE                               ~ ~ ~ ~ 

OUTPUT
606322089~ ~CHRISTINAI~E~MARCHETTO                          ~00210816~0000~ ~ ~ ~ ~ ~ ~ ~AD   DR    ADDRESSAD   DR~CINCINNATI            ~OH~452060000~ ~ ~SECOSXSDS ND SAMPLE                             ~ ~ ~ ~ 

1 个答案:

答案 0 :(得分:0)

这里有一些使用精度字段的例子:

# printf "X%-3.3sX\n" .
X.  X
# printf "X%-3.3sX\n" .........
X...X
# printf "X%-.3sX\n" .........
X...X
# printf "X%.3sX\n" .........
X...X
# printf "X%.3sX\n" .........
X...X
# printf "X%.5sX\n" .........
X.....X
# printf "X%.5sX\n" .
X.X
# printf "X%5.5sX\n" .
X    .X
# printf "X%-5.5sX\n" .
X.    X

当要打印的值小于宽度字段时,请注意精度字段和宽度字段组合的效果 precesion 字段值。

相关问题