我的文件包含 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
由于我并没有真正了解输入和输出中空格的使用,所以我只是删除了所有空格......