私のファイルには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
ここでは、3番目のフィールドをカンマで区切りました。これにより、分割されたビットがa
別々の配列要素として配列に割り当てられます。次に、3番目のフィールドを最初の位置に設定し、4番目のフィールドを2番目の位置に設定しました(およびa[1]
それぞれa[2]
)。
これは、3番目の元のフィールドにカンマのみが含まれているか、コンマがまったく含まれていないと想定しています。複数のカンマが含まれていると、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
入力と出力でスペースの使用を理解していなかったので、スペースをすべて削除しました...