예기치 않은 줄 바꿈이 있는 csv 파일이 있습니다. 파일은 대략 다음과 같습니다.
col1; col2; col3; col4
1a; 1b; 1c; 1d
2a; 2b; 2c
;2d # this should be in the row above
3a; 3b; 3c; 3d
;
이전 줄부터 시작하여 각 줄을 연결한 다음 삭제 하고 싶습니다 . 어떻게 해야 하나요?
답변1
$ sed -e '
:loop
$!N
s/\n;/;/
tloop
P;D
' file.csv
항상 패턴 공간에 두 개의 라인을 유지하십시오. 다음 줄 시작 부분에 세미콜론이 보이면 개행 문자를 자르고 루프백하여 다음 줄을 패턴 공간으로 읽어옵니다.
다음 줄에 세미콜론이 없으면 루프를 종료하고 첫 번째 개행 문자까지 인쇄한 다음 해당 부분을 삭제하고 반환하여 다음 줄을 패턴 공간에 추가합니다.
답변2
어때요?앗:
awk -F ';' '{while (NF < 4) {getline nextline; $0 = $0 nextline}} 1' file
답변3
다음 sed
스크립트가 필요할 수 있습니다.
sed -n '$p;N;s/[[:blank:]]*\n[[:blank:]]*;/;/;P;D' csv_file
고장 설명:
$p; # at last line of stream, just print it
N; # append the next line from input so that we always consider two lines at a time ...
s/[[:blank:]]*\n[[:blank:]]*;/;/; # then replace `\n;` (and any leading and trailing blanks) with just `;`, and ...
P; # print only the _first_ of the two lines present in memory and ...
D # then delete it and read one new line if memory becomes empty
첫 번째 명령은 $p
입력 라인의 총 개수가 홀수인 경우에만 실제로 무언가를 인쇄합니다. 스크립트의 나머지 부분은 입력 스트림의 메모리에 항상 두 라인이 있도록 보장하기 때문입니다.