我有两个问题
我做一个grep并获取输入文件的行号。我想从输入文件中检索行号之前和之后的一组行,并重定向到/ tmp / testout文件。我怎么能这样做。
我有一个行号10000,20000。我想检索输入文件的10000到20000之间的行,并重定向到/ tmp / testout文件。我该怎么做呢
答案 0 :(得分:8)
表示grep -C是直接选项
第二个问题试试吧!
sed -n "100000,20000p" bar.txt > foo.txt
答案 1 :(得分:2)
您想要查看grep的-A -B和-C选项。有关详细信息,请参阅man grep
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines.
Places a line containing -- between contiguous groups of
matches.
-B NUM, --before-context=NUM
Print NUM lines of leading context before matching lines.
Places a line containing -- between contiguous groups of
matches.
-C NUM, --context=NUM
Print NUM lines of output context. Places a line containing --
between contiguous groups of matches.
要重定向输出,请执行以下操作:grep "your pattern" yourinputfile > /tmp/testout
答案 2 :(得分:1)
请参阅head
和/或tail
。
例如:
head -n 20000 <input> | tail -n 10000 > /tmp/testout
而尾巴的参数是(20000 - 10000)。
答案 3 :(得分:1)
如果你正在使用GNU grep,你可以提供-B
和-A
来获取与grep匹配之前和之后的行。
E.g。
grep -B 5 -A 10 SearchString File
将打印每行匹配来自File的SearchString以及之前的5行和匹配行之后的10行。
对于问题的其他部分,您可以使用head / tail或sed。请参阅其他答案了解详情。
答案 4 :(得分:0)
对于第2部分,awk
将允许您打印一系列行:
awk 'NR==10000,NR==20000{print}{}' inputfile.txt >/tmp/testout
这基本上给出了基于记录号NR
的范围。
对于第1部分,可以使用grep
和--after-context=X
开关获取--before-context=X
的上下文。如果您运行的grep
不允许这样做,您可以根据上面的第2部分答案假设awk
脚本。
答案 5 :(得分:0)
看前后:(前3行和后3行)
grep -C3 foo bar.txt
第二个问题:
head -20000 bar.txt | tail -10000 > foo.txt
答案 6 :(得分:0)
你可以用awk做这些,例如在“6”之前和之后显示2行,并显示从4到8的亚麻布
$ cat file
1
2
3
4
5
6
7
8
9
10
$ awk 'c--&&c>=0{print "2 numbers below 6: "$0};/6/{c=2;for(i=d;i>d-2;i--)print "2 numbers above 6: "a[i];delete a}{a[++d]=$0} NR>3&&NR<9{print "With range: ->"$0}' file
With range: ->4
With range: ->5
2 numbers above 6: 5
2 numbers above 6: 4
With range: ->6
2 numbers below 6: 7
With range: ->7
2 numbers below 6: 8
With range: ->8
答案 7 :(得分:0)
如果您的grep
没有-A
,-B
和-C
,那么此sed
命令可能适合您:
sed -n '1bb;:a;/PATTERN/{h;n;p;H;g;bb};N;//p;:b;99,$D;ba' inputfile > outputfile
其中PATTERN
是您要查找的正则表达式,99
比您想要的上下文行数(相当于-C 98
)大一个。
它通过在内存中保留一行窗口来工作,当正则表达式匹配时,输出捕获的行。
如果您的sed
不喜欢分号并且更喜欢-e
,则此版本可能适用于您:
sed -n -e '1bb' -e ':a' -e '/PATTERN/{h' -e 'n' -e 'p' -e 'H' -e 'g' -e 'bb}' -e 'N' -e '//p' -e ':b' -e '99,$D' -e 'ba' inputfile > outputfile
对于您的行范围输出,如果在范围结束后有大量行,则此功能将会更快完成:
sed -n '100000,20000p;q' inputfile > outputfile
或
sed -n -e '100000,20000p' -e 'q' inputfile > outputfile