텍스트 파일의 각 줄을 검사하고 수정하기 위해 awk 스크립트를 만드는 데 문제가 있습니다.
다음 예를 고려하십시오.
$ cat employee.txt
"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla",
"Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Techno
logy","6000"
"501","Ritu","Accounting","5400"
보시다시피 일부 선이 잘못된 지점에서 끊어지는 것 같습니다. 패턴은 다음과 같아야 합니다.
$ cat employee.txt
"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"
따라서 awk에서 패턴이 따르지 않는지 확인하는 방법이 있는지 궁금합니다. 예를 들어 각 줄의 쉼표 수를 확인한 다음 줄바꿈을 백스페이스로 지정하는 방식입니다.
이런 수백, 수천 줄의 파일을 받기 때문에 깨진 줄을 일일이 고치는 수작업이 너무 지루하다.
SQLLDR을 사용하여 테이블에 데이터를 로드하기 위해 제어 파일을 생성하고 있는데 텍스트 파일에 줄 바꿈이 포함되어 있기 때문에 오류가 발생합니다. 그래서 내 해결책은 스크립트를 통해 각 줄을 수정하는 것이었습니다.
어떤 아이디어가 있나요? 스크립트가 Awk에 있을 필요는 없습니다.
답변1
$ awk -F, 'FNR == 1 { nf = NF } { while (NF < nf || !/[^,]"$/) { line = $0; getline; $0 = line $0 }; print }' file
"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"
이는 다음을 사용 awk
하고첫 번째 행에 올바른 수의 필드가 있다고 가정그리고 어떤 필드에도 쉼표가 포함될 수 없습니다. 또한 어떤 라인도 갖지 않을 것이라고 가정합니다.너무 많은즉, 줄에 추가 줄바꿈이 있을 수 있지만 다음/이전 줄에 연결된 줄은 없습니다.
필드 수가 잘못된 줄(또는 "
마지막 필드가 분할되었음을 의미하는 문자로 끝나지 않는 줄)이 발견되면 현재 줄이 변수에 저장되고 line
다음 줄을 읽습니다. 그런 다음 현재 행은 line
방금 읽은 행을 연결하여 업데이트됩니다. 이는 올바른 수의 필드가 있는 것으로 끝날 때까지 계속됩니다(여러 연속 분할선의 경우). 그런 다음 재구성된 라인을 인쇄합니다.
NF
awk
현재 레코드의 필드 수를 저장하는 특수 변수입니다 (기본적으로 하나의 레코드는 하나의 행입니다). 이 번호는 (현재 레코드)가 할당 되거나 새 레코드를 읽을 때 $0
자동으로 업데이트됩니다 . 이 nf
변수는 첫 번째 줄부터 시작하여 "올바른 필드 수"로 설정된 자체 변수입니다.
답변2
정규식을 통해 간단히 텍스트를 수정할 수 있습니다.
<input.csv perl -pe 's/^(.+)([^"])\n$/\1\2/g'
당신을 위한
"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"
답변3
짧은 awk 방법:
awk -F, '{ printf "%s%s", $0, $NF ~ /^$|[^"]$/? "":ORS }' file
$NF ~ /^$|[^"]$/
- 마지막 필드가$NF
빈 문자열 인지^$
, 큰따옴표가 없는 단어 인지 확인하세요.[^"]$
산출:
"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"
답변4
또 다른 awk
해결책:
awk -F, 'NF==4 { print $0 }; NF!=4 { str= $0; getline; print str $0 }' employee.txt
"100","Thomas","Sales","5000"
"200","Jason","Technology","5500"
"300","Mayla","Technology","7000"
"400","Nisha","Marketing","9500"
"500","Randy","Technology","6000"
"501","Ritu","Accounting","5400"