对齐要导入到数据库中的数据

对齐要导入到数据库中的数据

我的文件包含 44 列。问题是存在于,一个字段上。我想将这些数据划分到特定的列上,并将其放在它的下一列上。

生的:

122|abc |ds,we       |||wrqg
145|dw  |ett,335     |||nxd
166|rotl|qqqp,eoepepe|||ge
776|gge |022         |||pp
039|pot |011a        |||lot

预期输出:

122|abc |ds  |we||wrqg
145|dw  |ett |335||nxd
166|rotl|qqqp|eoepepe||ge
776|gge |022 |||pp
039|pot |011a|||lot

通过此输出,数据将导入到我的数据库表的正确字段中。

我已经尝试过这段代码,但数据将添加一个新列。

`awk -F '|' 'BEGIN { OFS=FS } { gsub(",", "|", $3); print }' file`

真的需要你们的帮助!

答案1

$ awk -F '|' 'BEGIN { OFS=FS } { split($3, a, ","); $3 = a[1]; $4 = a[2]; print }' file
122|abc |ds|we       ||wrqg
145|dw  |ett|335     ||nxd
166|rotl|qqqp|eoepepe||ge
776|gge |022         |||pp
039|pot |011a        |||lot

我在这里所做的是用逗号分隔第三个字段。这会将分割位a作为单独的数组元素分配到数组中。然后,我将第三个字段设置为第一位,将第四个字段设置为第二位(分别为a[1]a[2])。

这假设第三个原始字段仅包含一个逗号(或根本没有逗号)。如果它包含多个逗号,您将丢失第二个逗号之后的所有数据。

答案2

我有一种不同的方法,告诉awk使用|,作为分隔符,并决定根据该行中存在的字段数量来打印内容:

awk -F '[|,]' '
    BEGIN {OFS="|"}
    NF==6 {print $1,$2,$3,$4,$5,$6}
    NF==7 {print $1,$2,$3,$4,$6,$7}
' <(tr -d ' ' < file)

输出:

122|abc|ds|we||wrqg
145|dw|ett|335||nxd
166|rotl|qqqp|eoepepe||ge
776|gge|022|||pp
039|pot|011a|||lot

由于我并没有真正了解输入和输出中空格的使用,所以我只是删除了所有空格......

相关内容