如何在ubuntu中使用grep计算新行数
(最后一个提示,在问题的开头:我在提问之前已经解决了这个问题,滚动到最后) 我正在尝试解析一个大文件,在我进行更改之前,我想我会运行一些“简单”的测试来确认我得到了所需的输出,但是我做得不够 以下是文件格式的捕获:如何在ubuntu中使用grep计算新行数,ubuntu,grep,escaping,special-characters,Ubuntu,Grep,Escaping,Special Characters,(最后一个提示,在问题的开头:我在提问之前已经解决了这个问题,滚动到最后) 我正在尝试解析一个大文件,在我进行更改之前,我想我会运行一些“简单”的测试来确认我得到了所需的输出,但是我做得不够 以下是文件格式的捕获: 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 |DE
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
这些结果与预期一致。差值为5248,即换行数。到目前为止,一切顺利
额外的账单怎么了
我又添加了一个测试,但事情并不像预期的那样:
tr -s '\r\n' '\t\t' < orig > o.rntt
-rw-rw-r-- 1 madivad madivad 615271 Oct 30 09:40 o.rntt
(注:这(Q1)更多的是一个附带问题,我只是在确认所有问题时才发现这一点,我真正的问题如下)
如何正确测试或计算“换行符”
在运行我的测试时,我想计算一下新行的出现次数,我用几种方法确认了这一点,得到了正确的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
转换和测试的确认
对于输出文件,tr'\r\n'\t'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
$ 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
在我使用的地方:tr-s'\n'\t'o.nt
它似乎也起了作用,我的测试又错了:
$ 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
$ 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
,因为文件中实际上有一个额外的选项卡(长话短说)
回顾过去,我会如何使用hextump计算它,并注意到线路交叉?在做最后的测试时,我终于得到了它
我已经做好了发布这个问题的准备,就像过去发生在我身上的无数次一样,问一个stackexchange问题导致我在发布答案之前就已经知道了答案
我已经这样做了一个多小时了,但是我看到了我的错误。我仍在发布这篇文章,因为我花了这么多时间学习,也许这可以防止其他人这样做:/
我忘记了grep-c
将计算行数,通过删除newline
字符,文件中只有一行:(
我想出了这个测试:
$ grep -o -P '\t' o.nt | wc -l
5249
谢谢你,这是我多次尝试不同事物后留下的。我只是向上箭头,改变我在单引号之间的行中的内容。
$ grep -o -P '\t' o.nt | wc -l
5249