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