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

时间:2017-10-02 15:54:10

标签: shell unix sed

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>

我想只提取Cell 055部分中的行。

我已经完成了Cell 094部分,如下所示

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

我已经忘记了sed在这种情况下是如何工作的,我无法弄清楚如何提取到最好的单元格094&#39;文本。

4 个答案:

答案 0 :(得分:4)

目前还不清楚您的预期输出是什么,但sed可以通过range addressing轻松提取一系列行,其中每个地址可以是行号,或正则表达式< / em>的

例如,要获取以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

答案 1 :(得分:2)

sed适用于s / old / new,均为。这不是你想要做的,所以你不应该考虑使用sed。只需使用awk:

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

你没有向我们展示预期的输出,你发布的sed + grep管道产生没有输出所以idk如果上面是你想要的,它只是一个猜测,但不管它是什么你想要正确的工具使用它是awk,而不是sed。

答案 2 :(得分:0)

在Solaris / SunOS系统上,将awk更改为/usr/xpg4/bin/awk/usr/xpg6/bin/awknawk您可以尝试关注awk并告诉我这是否对您有所帮助。

解决方案1:如果您想打印字符串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

解决方案3:如果您想要打印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'

答案 3 :(得分:0)

如果您的文件格式在每个Cell标题后只允许2行,那么您也可以使用grep:

grep "Cell 055" -A2 file

@ Ed-Morton在回答中提及

awk