2개의 행을 하나로 병합하는 방법

2개의 행을 하나로 병합하는 방법

나는 다음과 같은 기록을 가지고 있습니다

"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에는 간결한 명령 구문이 있습니다. 이것은 무엇을 위한 것인가?

  1. :a라벨 생성을 위해 ,
  2. N명령은 다음 줄을 추가합니다.
  3. 우리 태그로 분기하세요 $!ba.
  4. s사이의 텍스트를 교체합니다 ./\n(...)/
  5. 첫 번째 새 줄은 \n대괄호 밖에 있으므로 제거됩니다.
  6. /\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알려줍니다 . csvjsonjq식은 각 행에 있는 두 필드의 합을 사용합니다 .a..b

답변4

다음 행의 레코드가 포함된 CSV를 수정하려면 sed편집기를 사용할 수 있습니다.

$ sed -e '
    $!N
    /\n"/!s/\n//
    P;D
' file.csv

설명하다:

  • 큰따옴표로 시작하지 않는 줄은 오버플로되므로 이전 줄과 병합되도록 줄바꿈을 제거합니다.
  • P;Dpragma는 eof까지 이 프로세스를 반복합니다.
  • 명령을 통해 csv 파일의 2줄을 패턴 공간으로 확인합니다 $!N.

awk입력 라인을 기반으로 출력 레코드 구분 기호를 조작하고 원하는 출력을 얻을 수 있습니다.

$ awk '{ORS = /"$/ ? RS : ""}1' file.csv

관련 정보