当新行在数据中时,计算txt文件中的行数



我有一个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 

此外,我的文件可能有300-400万条记录。所以将文件转换为unix格式需要一些时间,这不是我的偏好。因此,请建议一些最佳解决方案,这两种情况下都应该工作

head 5.csv | cat -A  
Above command is giving me the output

名称移动url消息文本^M$

使用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/, "&"):Dummy将n替换为自身,并对变量n中的n进行计数
  • END {print n}:最后打印n
  • sed '$s/$//' file:对于最后一行添加一个换行符(以防丢失(

代码演示

对于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

与anubhava相同,但带有GNU sed:

<infile sed '/"/ { :a; N; /"$/!ba; s/n/ /g; }' | wc -l

输出:

3

相关内容

  • 没有找到相关文章

最新更新