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;文本。
答案 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/awk
或nawk
您可以尝试关注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 。