我不是以英语为母语的人所以我希望能说清楚。
我知道要grep -C 2 "TARGET" inputfile
选择目标行前后的 2 行,但我无法使用它来解决问题。我有如下结构的文件
1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3
6 0 value1 value2 value3
7 0 value1 value2 value3
8 H value1 value2 value3
9 0 value1 value2 value3
包含多行。所需的解决方案是这样的
X X X X X
1 0 value1 value2 value3
2 H value1 value2 value3 *
3 H value1 value2 value3
4 H value1 value2 value3
1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3 *
4 H value1 value2 value3
5 H value1 value2 value3
... all the other till
6 0 value1 value2 value3
7 0 value1 value2 value3
8 H value1 value2 value3 *
9 0 value1 value2 value3
X X X X X
其中 TARGET 是 "H" , * 表示选定的行(但在输出文件中我不需要 * ), X 是占位符,用于调整目标之前或之后的行数! 我也尝试使用 awk 和 sed,但没有结果。
答案1
与 Glenn Jackman 的方法相同,但使用循环缓冲区,而不是在每个输入时旋转缓冲区:
awk -v N=2 -v TARGET=" H " -v PLACE="X X X X X" '
function check(n, s, i) {
a[n%NN]=s
if (n>N&&a[(n-N)%NN]~TARGET) {
for (i=n+1;i<=n+NN;++i)
print a[i%NN]
print ""
}
}
BEGIN{
NN=2*N+1
a[0]=PLACE
for (i=1;i<=N;++i) { getline a[i]; a[i+N]=PLACE }
}
{ check(NR,$0) }
END{
for (i=NR+1;i<=NR+N;++i) check(i,PLACE)
}'
答案2
这将帮助你达到大部分目标:
awk -v n=2 -v target=" H " '
BEGIN {
lines[0]=""
for (i=1; i<=n; i++) {
lines[i]="X X X X X"
getline; lines[n+i]=$0
}
}
function rotate(i) {
for (i=1; i<=n*2; i++)
lines[i-1] = lines[i]
lines[n*2]=$0
}
function check(i) {
if (lines[n] ~ target) {
for (i=0; i<=n*2; i++)
print lines[i]
print ""
}
}
{ rotate(); check() }
END {
for (i=1; i<=n; i++) {
$0 = "X X X X X"; rotate(); check()
}
}
' inputfile
输出
X X X X X
1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3
6 0 value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3
6 0 value1 value2 value3
7 0 value1 value2 value3
6 0 value1 value2 value3
7 0 value1 value2 value3
8 H value1 value2 value3
9 0 value1 value2 value3
X X X X X