새 줄이 데이터 안에있을 때 txt 파일의 줄 수 계산
Nov 27 2020
아래 데이터가있는 txt 파일이 하나 있습니다.
Name mobile url message text
test11 1234567890 www.google.com "Data Test New
Date:27/02/2020
Items: 1
Total: 3
Regards
ABC DATa
Ph:091 : 123456789"
test12 1234567891 www.google.com "Data Test New one
Date:17/02/2020
Items: 26
Total: 5
Regards
user test
Ph:091 : 433333333"
이제 마지막 열 데이터에 새 줄 문자가 있음을 알 수 있습니다. 그래서 아래 명령을 사용할 때
awk 'END{print NR}' file.txt
내 길이는 15이지만 실제로 선 길이는 3입니다. 같은 명령을 제안하십시오
편집 된 부분 : 주어진 대답에 따라 입력 파일 끝에 줄 바꿈이 없으면 아래 스크립트가 작동하지 않습니다.
awk -v RS='"[^"]*"' '{gsub(/\n/, " ", RT); ORS=RT} END{print NR "\n"}' test.txt
또한 내 파일에는 3-4 백만 개의 레코드가있을 수 있습니다. 따라서 파일을 유닉스 형식으로 변환하는 데 시간이 걸리며 이것이 선호하는 것이 아닙니다. 따라서 두 경우 모두 작동하는 최적의 솔루션을 제안하십시오.
head 5.csv | cat -A
Above command is giving me the output
이름 모바일 URL 메시지 텍스트 ^ M $
답변
7 anubhava Nov 27 2020 at 09:49
를 사용 gnu-awk
하면 사용자 정의를 사용하여이를 수행 할 수 있습니다 RS
.
awk -v RS='"[^"]*"' '{gsub(/(\r?\n){2,}/, "\n"); n+=gsub(/\n/, "&")}
END {print n}' <(sed '$s/$//' file)
15001
여기:
-v RS='"[^"]*"'
:이 정규식을 입력 레코드 구분 기호로 사용합니다. 큰 따옴표로 묶인 문자열과 일치합니다.n+=gsub(/\n/, "&")
: 더미\n
자체 교체 및\n
변수 계산n
END {print n}
:n
결국 인쇄sed '$s/$//' file
: 마지막 줄에 개행을 추가합니다 (누락 된 경우)
코드 데모
1 Sundeep Nov 27 2020 at 10:14
와 함께 perl
, 마지막 줄이 항상 개행 문자로 끝난다고 가정합니다.
$ perl -0777 -nE 'say s/"[^"]+"(*SKIP)(*F)|\n//g' ip.txt
3
-0777
전체 입력 파일을 단일 문자열로 처리하기 위해 입력 파일이 매우 큰 경우에는 적합하지 않습니다.- 이
s
명령은 만든 대체 수를 반환 하며 여기에서 줄 바꿈 수를 가져옵니다. "[^"]+"(*SKIP)(*F)
큰 따옴표 안의 줄 바꿈이 무시됩니다.
줄 바꿈 문자로 끝나지 않더라도 마지막 줄을 세고 싶다면 아래 명령을 사용할 수 있습니다.
perl -0777 -nE 'say scalar split /"[^"]+"(*SKIP)(*F)|\n/' ip.txt
Thor Nov 27 2020 at 13:10
anubhava 와 동일 하지만 GNU sed :
<infile sed '/"/ { :a; N; /"$/!ba; s/\n/ /g; }' | wc -l
산출:
3