有没有办法在目标之前和之后打印两行(如果有)或者如果没有则打印占位符?

有没有办法在目标之前和之后打印两行(如果有)或者如果没有则打印占位符?

我不是以英语为母语的人所以我希望能说清楚。

我知道要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

相关内容