【发布时间】:2014-01-16 19:34:50
【问题描述】:
我的要求是删除unix中的特殊字符和多个连续空格,并将文件转换为csv文件。我能够实现上述目标但我的问题是我的输出 csv 文件列长度与表列长度不同。我需要在删除特殊字符和空格后修剪列,所以在 bcp out data 之前我不能在视图中这样做。
我需要在 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 个字符(数据最大为 20 个字符) column5 - 19 个字符(数据最多 35 个字符) column19 - 21 个字符(数据最多 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 ~ ~ ~ ~
【问题讨论】:
-
发布一些示例输入和预期输出。
-
请注意,
printf "%3s" abcdef将不会将字符串截断为 3 个字符,如有必要,您必须自己执行此操作(使用substr()) -
@glenn jackman 我也在 awk 命令中尝试了子字符串
MFNAME=substr($2,1,10) MLNAME=substr($4,1,19) CSADDR=substr($14,1,25) CSCITY=substr($15,1,19) CSNAME=substr($20,1,50)仍然没有修剪 -
@EdMorton 添加了示例输入和输出文件
-
您是否尝试过在 printf 指令中使用 precision 字段?阅读 printf(3) 手册页。
标签: unix awk special-characters fixed-length-record