我有几次具有相同模式的文件。 类似的东西:
time
12:00
12:32
23:22
time
10:32
1:32
15:45
我想在模式之后打印行,在示例time
中
在几个文件中。模式后的行数是常量。
我发现我可以通过awk '/time/ {x=NR+3;next}(NR<=x){print}' filename
获得问题的第一部分
但我不知道如何将每个块输出到不同的文件中。
修改
我的文件比我原来的问题复杂一点。 它们具有以下格式。
4
gen
C -4.141000 -0.098000 0.773000
H -4.528000 -0.437000 -0.197000
H -4.267000 0.997000 0.808000
H -4.777000 -0.521000 1.563000
4
gen
C -4.414000 -0.398000 4.773000
H -4.382000 -0.455000 -4.197000
H -4.267000 0.973000 2.808000
H -4.333000 -0.000000 1.636000
我想在
之后打印这些行 4
gen
编辑2
我的预期输出为x
个文件x=# pattern
。
从我的第二个例子,我想要两个文件:
C -4.141000 -0.098000 0.773000
H -4.528000 -0.437000 -0.197000
H -4.267000 0.997000 0.808000
H -4.777000 -0.521000 1.563000
和
C -4.414000 -0.398000 4.773000
H -4.382000 -0.455000 -4.197000
H -4.267000 0.973000 2.808000
H -4.333000 -0.000000 1.636000
答案 0 :(得分:3)
您可以使用此awk命令:
export const SOME_ACTION = 'SOME_ACTION';
export function someAction() {
return (dispatch, getState) => {
const {items} = getState().otherReducer;
dispatch(anotherAction(items));
}
}
这个awk命令基于固定前缀awk '/time/{close(out); out="output" ++i; next} {print > out}' file
和递增计数器out
创建变量output
,每当我们得到一行i
时,它会递增。所有后续行都将重定向到此输出文件。关闭这些文件句柄以避免内存泄漏是一种很好的做法。
PS:如果您还想在输出中输入time
行,请在上面的命令中删除time
。
答案 1 :(得分:0)
修订后的“4 / gen”要求有些含糊不清,但下面的脚本(只是@ anubhava的变体)符合给出的并且可以轻松修改以处理各种边缘情况:
awk '
/^ *4 *$/ {close(out); out=0; next}
/^ *gen *$/ && out==0 {out = "output." ++i; next}
out {print > out} '
答案 2 :(得分:-1)
我在这里找到了anubhava的另一个答案How to print 5 consecutive lines after a pattern in file using awk
并且使用head和for循环我解决了我的问题:
for i in {1..23}; do grep -A25 "gen" allTemp | tail -n 25 > xyz$i; head -n -27 allTemp > allTemp2; cp allTemp2 allTemp; done
我知道文件allTemp
的{{1}}次出现23
。
Head将删除我打印到gen
的行以及我不想要的两行,它会将新文件输出到xyzi