Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何修复dat文件中的列长度并将其转换为csv文件_Unix_Awk_Special Characters_Fixed Length Record - Fatal编程技术网

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

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:]]/,"

我的要求是删除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列,其中 第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命令中尝试了substring
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)
仍然不是trimmed@EdMorton添加了示例输入和输出文件您是否尝试在printf指令中使用精度字段?。阅读printf(3)手册页面。