Unix 如何修复dat文件中的列长度并将其转换为csv文件
我的要求是删除unix中的特殊字符和多个连续空格,并将文件转换为csv文件。我能够实现上述目标,但我的问题是我的输出csv文件列长度与表列长度不同。我需要在删除特殊字符和空格后修剪列,以便在bcp输出数据之前在视图中不能这样做 我需要在unix内部处理这个问题 下面是我正在使用的命令Unix 如何修复dat文件中的列长度并将其转换为csv文件,unix,awk,special-characters,fixed-length-record,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:]]/,"
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列,其中
第3列-10个字符(数据最多20个字符)
第5列-19个字符(数据最多35个字符)
列19-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
在某些行中使用此命令后,记录将移动到下一列,文件将完全重叠。请帮助我,我为此奋斗了两天
样本输入和期望输出
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 "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
当要打印的值小于宽度字段和进动字段值时,请注意精度字段和宽度字段组合的影响。发布一些示例输入和预期输出。请注意
printf“%3s”abcdef
不会将字符串截断为3个字符,如果需要,您必须自己执行(使用substr()
)@glenn jackman我也在awk命令中尝试了substringMFNAME=substr($2,1,10)MLNAME=substr($4,1,19)CSADDR=substr($14,1,25)CSCITY=substr($15,1,19)CSNAME=substr($20,1,50)
仍然不是trimmed@EdMorton添加了示例输入和输出文件您是否尝试在printf指令中使用精度字段?。阅读printf(3)手册页面。