새 줄이 데이터 안에있을 때 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