내 파일에는 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
입력과 출력에서 공백의 사용을 잘 이해하지 못했기 때문에 공백을 모두 제거했습니다...