我在文件中有测试数据text.txt
a
b
test
test2
1,2
3,3
我想从 test 为 + 2 的行号开始输出文件。我需要这是一个可用的 oneliner gnuplot
,我想出了以下内容:
awk -v linestart=$(awk '$0~"test" {a=NR}END{print a+2}' $filename) 'BEGIN{FS=",";OFS="\t";lines}NR>=linestart{print $1, $2}' $filename
但我需要以某种方式将文件内容提供给awk
我不知道该怎么做的两个。所以我想出了解决方案,$filename
但这有问题,如何进入$filename
。
我是这样想的:
echo "test.txt" | read filename | awk -v linestart=$(awk '$0~"test" {a=NR}END{print a+2}' $filename) 'BEGIN{FS=",";OFS="\t";lines}NR>=linestart{print $1, $2}' $filename
但这不起作用。
我还能如何进行上述工作?明显的问题是我需要在运行之前知道要开始打印的行号awk
。我也在思考这个问题:
awk 'BEGIN{FS=",";OFS="\t";lines=100000}{if ($0~"test"){lines=NR+2}; if(NR>=lines){print $1, $2}}'
但我什至没有尝试过,因为它非常难看而且不通用,我必须使变量lines
总是足够大。那么是否有一个优雅的解决方案可以与普通的文本文件管道一起使用,或者在其他情况下可以通过某种方式将文件名推入其中?
使用
ed
:在
ed
编辑器中,该命令/^test/+2,$p
将打印 (p
) 匹配行之外的两行^test
到末尾 ($
) 的行。使用
awk
:flag
在这里,如果为 1 且如果count
小于或等于 0 ,将打印一行。^test
当模式在输入数据中匹配时,该标志设置为 1 ,count
然后还设置为要跳过的行数,直到输出应该开始(不包括当前行)。所有行的count
都减小。稍微不同的方法
awk
:在这里,我们匹配我们的模式,然后立即读取并丢弃下一行输入。然后我们使用 while 循环读取文件的其余部分,打印读取的每一行。
完全相同的方法,但使用
sed
:匹配模式,然后读取并丢弃下一行 (
n
),然后进入循环读取并打印每一行 (n; p;
)。循环由标签again
和分支/跳转到该标签 (b again
) 组成。如果您知道您的数据在 之后 2 行开始
test
,并且上面没有更多行test
,则可以使用以下方法:此外,要将这些数据发送到 Gnuplot,您可以考虑通过这样的管道进行操作:
start, end
您可以使用具有始终为假的结束条件和跳过行的开始条件的范围来轻松地做到这一点:另请参阅https://stackoverflow.com/a/17914105/1745001