gpt4 book ai didi

ubuntu - 如何在 ubuntu 中使用 grep 计算新行数

转载 作者:行者123 更新时间:2023-12-04 18:46:47 25 4
gpt4 key购买 nike

(最后一点,在问题的开头:我在提问之前已经解决了这个问题,滚动到最后)

我正在尝试解析一个大文件,在进行更改之前,我想我会运行一些“简单”测试以确认我得到了所需的输出,但我做不到。

这是文件格式的捕获:

00000030  32 2e 31 2e 30 65 2c 0d  0a 43 4c 49 45 4e 54 5f  |2.1.0e,..CLIENT_|
00000040 44 45 4d 4f 2c 31 2c 31 2c 22 4c 4b 44 55 41 32 |DEMO,1,1,"LKDUA2|

我想要做的是转换所有换行符 \x0d\x0a\r\n进入我正在使用的其他东西 \x09\t为此,我可以重新解析它,并且只将其中的一些转换回新行。

我意识到可能有更好的方法可以做到这一点,但我正在尝试使用我已经(以为我)知道的东西。

首先我进行了一些试验:
tr -s '\r\n' '\t' < orig > o.rnt
tr -s '\n' '\t' < orig > o.nt
tr -s '\r' '\t' < orig > o.rt

和文件大小:
$ ls -l o*
-rw-r----- 1 madivad madivad 620519 Oct 30 09:41 orig
-rw-rw-r-- 1 madivad madivad 620519 Oct 30 09:26 o.nt
-rw-rw-r-- 1 madivad madivad 620519 Oct 30 09:26 o.rt
-rw-rw-r-- 1 madivad madivad 615271 Oct 30 09:40 o.rnt

这些结果符合预期。差异是 5248,这是换行符的数量。到目前为止,一切都很好。

额外标签发生了什么

我又添加了一项测试,但事情并不像预期的那样:
tr -s '\r\n' '\t\t' < orig > o.rntt

-rw-rw-r-- 1 madivad madivad 615271 Oct 30 09:40 o.rntt

我期待 620519 但 hexdump 仅确认 1x \t被添加回来
00000030  32 2e 31 2e 30 65 2c 09  43 4c 49 45 4e 54 5f 44  |2.1.0e,.CLIENT_D|

(注意:这个(Q1)更多的是一个附带的问题,我只是在确认所有问题时才发现这个问题,我的真正问题如下)

如何正确测试或计算“换行符”

在运行我的测试时,我想计算 newline 的出现次数。 's 和我确认了这几种方法,导致正确的 5248... 对于某些结果。似乎 \n没有正确解析。
$ grep -c ^ orig
5248
$ grep -c -P '\r' orig
5248
$ grep -c -P '\r' o.rt
5248
$ grep -c -P '\x0d' o.rt
5248
$ grep -c -P '\t' o.rnt
1
$ grep -c -P '\n' orig
0
$ grep -c -P '\x0a' orig
0
$ grep -c -P '\r\n' orig
0

确认转换和测试
$ hexdump -C -s 48 -n 32 orig
00000030 32 2e 31 2e 30 65 2c 0d 0a 43 4c 49 45 4e 54 5f |2.1.0e,..CLIENT_|

$ hexdump -C -s 48 -n 32 o.rt
00000030 32 2e 31 2e 30 65 2c 09 0a 43 4c 49 45 4e 54 5f |2.1.0e,..CLIENT_|

$ hexdump -C -s 48 -n 32 o.nt
00000030 32 2e 31 2e 30 65 2c 0d 09 43 4c 49 45 4e 54 5f |2.1.0e,..CLIENT_|

$ hexdump -C -s 48 -n 32 o.rnt
00000030 32 2e 31 2e 30 65 2c 09 43 4c 49 45 4e 54 5f 44 |2.1.0e,.CLIENT_D|

对于输出文件, tr '\r\n' '\t' < orig > o.rnt似乎做得对,但我的 grep测试它是错误的:
$ hexdump -C -n 600 o.rnt | grep -P ' 09 '
00000030 32 2e 31 2e 30 65 2c 09 43 4c 49 45 4e 54 5f 44 |2.1.0e,.CLIENT_D|
00000110 2c 22 22 2c 31 2c 2c 09 43 4c 49 45 4e 54 5f 41 |,"",1,,.CLIENT_A|
000001a0 22 22 2c 30 2c 22 22 2c 09 43 4c 49 45 4e 54 5f |"",0,"",.CLIENT_|
00000200 73 65 2c 46 61 6c 73 65 2c 30 2c 09 43 4c 49 45 |se,False,0,.CLIE|
00000230 31 2c 09 43 4c 49 45 4e 54 5f 43 4e 53 4e 54 2c |1,.CLIENT_CNSNT,|

$ grep -c -P '\t' o.rnt
1

我用过的地方: tr -s '\n' '\t' < orig > o.nt它似乎也有效,我的测试又错了:
$ hexdump -C -n 600 o.nt | grep -P ' 09 '
00000030 32 2e 31 2e 30 65 2c 0d 09 43 4c 49 45 4e 54 5f |2.1.0e,..CLIENT_|
00000110 30 2c 22 22 2c 31 2c 2c 0d 09 43 4c 49 45 4e 54 |0,"",1,,..CLIENT|
000001a0 22 2c 22 22 2c 30 2c 22 22 2c 0d 09 43 4c 49 45 |","",0,"",..CLIE|
00000200 46 61 6c 73 65 2c 46 61 6c 73 65 2c 30 2c 0d 09 |False,False,0,..|
00000230 2c 31 32 30 31 2c 0d 09 43 4c 49 45 4e 54 5f 43 |,1201,..CLIENT_C|

$ grep -c -P '\t' o.nt
1

谢谢

我不想继续前进,直到我明白我要去哪里错了,这样我就不会进一步加剧问题:)

我解决了

如上所述,我实际上已经解决了,但现在可以问:

1.有没有更好的方法?

这是我提出的测试,我会很高兴有任何改进:
$ grep -o -P '\t' o.nt | wc -l
5249

哦,是的,还有一个额外的 \t因为文件中实际上有一个额外的选项卡(长篇大论)

回想起来,我将如何使用 hexdump 来计算它,注意线路交叉?即计数或显示 0D 0A

最佳答案

在做我的最终测试时,我终于明白了

我已经准备好发布这个问题了,就像我过去多次发生的那样,问一个 stackexchange 问题导致我在发布之前就知道了答案。

我已经在这里待了一个多小时,但是看到了我的方式的错误。我仍在发布此内容,因为我花了这么长时间来学习,也许它可以阻止其他人这样做:/

我忘了grep -c将计算行数并删除 newline字符,我将在文件中只有一行:(

我想出了这个测试:

$ grep -o -P '\t' o.nt | wc -l
5249

关于ubuntu - 如何在 ubuntu 中使用 grep 计算新行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com