나는 다음과 같은 기록을 가지고 있습니다
"1234", "abcg"
"456899","jklm
sd"
"34566","lmno"
같은 줄의 두 번째 레코드를 계속하고 싶으므로 출력은 다음과 같습니다.
"1234", "abcg"
"456899","jklmsd"
"34566","lmno"
요점은 두 행으로 나누는 대신 두 번째 행을 계속하고 싶다는 것입니다
답변1
이 시도,
awk '/^"/{printf "\n";} {printf "%s",$0}' test.csv
"1234", "abcg"
"456899","jklmsd"
"34566","lmno"
/^"/{printf "\n";}
줄이 큰따옴표로 시작하면 새 줄이 추가됩니다.{printf "%s",$0}
각 행의 새 줄이 삭제됩니다.
답변2
이 awk
방법은 단순성 때문에 잘 작동합니다. 그러나 sed
에서 제안한 대로 스트림 편집기를 사용하여 여러 줄에 걸쳐 작업하는 것도 가능합니다 .이 답변. 이 기술은 다른 상황에서도 유용할 수 있습니다.
sed -r ':a;N;$!ba;s/\n([^, "]+\"\n)/\1/g' file
Sed에는 간결한 명령 구문이 있습니다. 이것은 무엇을 위한 것인가?
:a
라벨 생성을 위해 ,- 이
N
명령은 다음 줄을 추가합니다. - 우리 태그로 분기하세요
$!ba
. s
사이의 텍스트를 교체합니다 ./\n(...)/
- 첫 번째 새 줄은
\n
대괄호 밖에 있으므로 제거됩니다. /\1/
괄호 안에 있는 내용을 다시 넣으세요.
패턴 [^, "]
regex
은 불완전한 필드를 찾는 빠른 추측입니다. 따옴표로 끝나는 쉼표나 공백이 없는 줄을 찾아 이전 줄에 추가합니다. 파일에는 이와 같은 간단한 패턴으로 해결할 수 없는 다른 불일치가 있을 수 있습니다.
결과:
"1234", "abcg"
"456899","jklmsd"
"34566","lmno"
답변3
csvjson
아래 코드는 from을 사용하여 CSV 데이터의 두 번째 열에 포함된 줄 바꿈을 모두 제거합니다.csvkit데이터를 JSON으로 변환한 다음 jq
모든 줄바꿈을 찾아서 바꾸고 데이터 형식을 CSV로 다시 지정합니다.
$ csvjson -H file.csv | jq -r '.[] | .b |= gsub("\n"; "") | [ .a, .b ] | @csv'
1234," ""abcg"""
456899,"jklmsd"
34566,"lmno"
이상하게 보이는 것은 " ""abcg"""
원본 데이터에 큰따옴표가 포함되어 있기 때문입니다(필드의 첫 번째 큰따옴표 앞의 공백으로 인해 필드를 인용하는 것이 아니라 데이터에 포함됨).
옵션은 첫 번째 행이 헤더 행이 아니라 데이터임을 도구에 -H
알려줍니다 . csvjson
이 jq
식은 각 행에 있는 두 필드의 합을 사용합니다 .a
..b
답변4
다음 행의 레코드가 포함된 CSV를 수정하려면 sed
편집기를 사용할 수 있습니다.
$ sed -e '
$!N
/\n"/!s/\n//
P;D
' file.csv
설명하다:
- 큰따옴표로 시작하지 않는 줄은 오버플로되므로 이전 줄과 병합되도록 줄바꿈을 제거합니다.
P;D
pragma는 eof까지 이 프로세스를 반복합니다.- 명령을 통해 csv 파일의 2줄을 패턴 공간으로 확인합니다
$!N
.
awk
입력 라인을 기반으로 출력 레코드 구분 기호를 조작하고 원하는 출력을 얻을 수 있습니다.
$ awk '{ORS = /"$/ ? RS : ""}1' file.csv