在行的开头和结尾之间查找:awk具有bash变量,每次都添加新段落

时间:2019-12-22 19:41:47

标签: awk

输入:

xxx word1 xxx xxx
xxx xxxx word2
45
776
8
start
1
2
3
finish
45
3
6

原始代码:

awk -v s="startpoint" -v e="finishpoint" '$0~s,$0~e' input >> output.

该代码本身可以完美运行。但是,当我与其他人结合时,它是行不通的。我喜欢开始新的段落,所以我放了printf "/n",但是它也没有用

awk -v s="start" -v e="finish" 'BEGIN { ORS="" } /#word1/ {gsub(/,/,"",$2); print $2 "\t"} /#word2/ {print $2, "\n"} $0~s,$0~e' input >> output 

输出:

start 1 2 3 finish

理想的输出:

start

1

2

3

finish

2 个答案:

答案 0 :(得分:3)

为什么不简单地添加另一个变量作为标记变量来控制打印。 (例如,prn=0,然后在找到start时设置prn=1,如果prn=1,则打印所有行,然后在到达finish时退出。例如,您可以执行以下操作:

awk -v s="start" -v e="finish" -v prn=0 '
    BEGIN { ORS="" }
    $0~s { prn=1 }
    prn==1 { printf "%s\n\n", $0 }
    $0~e {exit}
' input

注意:将ORS保留为换行符会更简单)

使用/输出示例

只需在命令行上粘贴即可:

$ awk -v s="start" -v e="finish" -v prn=0 '
>     BEGIN { ORS="" }
>     $0~s { prn=1 }
>     prn==1 { printf "%s\n\n", $0 }
>     $0~e {exit}
> ' input
start

1

2

3

finish

匹配您的输出。 (如果您真的不想空行,只需删除'\n'语句中的printf之一)

要查找所有startfinish,只需重置prn标记为零

要在第一个exit之后不要finish,而是要找到startfinish的所有情况,请重置prn=0,例如

awk 'BEGIN { ORS=""; s="start"; e="finish"; prn=0 }
    $0~s { prn=1 }
    prn==1 { printf "%s\n\n", $0 }
    $0~e { prn=0 }
' input

注意:,由于您一直在使用BEGIN规则,因此我组合设置了所有变量)

现在所有startfinish部分将以相同的方式输出。

让我知道您是否在要求稍有不同或还有其他问题。

答案 1 :(得分:1)

我找到了解决方案,并希望与大家分享。

awk -v s="start" -v e="finish" '$0~s,$0~e {print $0 "\t"}'

如果您想选择要从文本文件中提取的列,则可以使用

awk -v s="start" -v e="finish" '$0~s,$0~e {print $1 "\t" $2 "\t" $4 "\t"}'