提取两个常数之间的文件部分



ksh solaris10。

我有一个大型文本文件

Cell 011
458754544 5.91
459923124 100.00
Cell 055
123456789 0.99
123454787 0.55
Cell 094
18759844 5.44
13549986 
<end of file>

我只想在单元格055节中提取行。

我已经为单元094部分做了下面的

sed -n '/Cell 094 :/,$p' $INFILE | grep \. | sed 's/^  //g' | sed 's/ {1,}/,/g' 

我忘记了在这种情况下SED的工作方式,我无法弄清楚如何提取到"单元格094"文本。

尚不清楚您的预期输出是什么,但是sed可以轻松地通过范围地址提取一系列行,每个地址都可以是行号,或者是正则表达式

例如,要获得以Cell 055开头的完整块,并以空白为结尾:

$ sed -n '/Cell 055/,/^$/p' file
Cell 055
123456789 0.99
123454787 0.55

另外,仅获取,没有范围的启动和终点:

$ sed -n '/Cell 055/,/^$/{//!p}' file
123456789 0.99
123454787 0.55

sed适用于s/old/new,,即全部。那不是您要做的事情,因此您不应该考虑使用SED。只需使用尴尬:

$ awk -v RS= '/^Cell 055/' file
Cell 055
123456789 0.99
123454787 0.55

您没有向我们展示预期的输出,而您发布的SED GREP管道不会产生任何输出,因此如果您想要或不想要的,这只是一个猜测,而是一个猜测,但是无论您想要什么使用它很尴尬,而不是

在solaris/sunos系统上,将 awk更改为 /usr/xpg4/bin/awk/usr/xpg6/bin/awknawk,您可以尝试遵循awk,让我知道是否有帮助。

解决方案1st:如果要在字符串Cell 055之后打印所有行,包括空白行,然后以下可能会帮助您。

awk '/Cell/ && !/Cell 055/{flag="";next} /Cell 055/{flag=1;next} flag'  Input_file

解决方案第二:如果要避免Cell 055中的空白行,则随后可能会在同一中帮助您。

awk '/Cell/ && !/Cell 055/{flag="";next} /Cell 055/{flag=1;next} flag && NF'  Input_file

解决方案3rd:如果要打印Cell 055行也可能会在同一中帮助您。

awk '/Cell/ && !/Cell 055/{flag="";next} /Cell 055/{flag=1;print;next} flag' Input_file
OR
awk '/Cell/ && !/Cell 055/{flag="";next} /Cell 055/{flag=1;print;next} flag && NF'

如果您的文件格式在每个单元标头后仅允许2行,那么您也可以使用GREP:

grep "Cell 055" -A2 file

awk @ed-morton在答案中提到的。

最新更新