输入:
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
答案 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
之一)
要查找所有start
和finish
,只需重置prn
标记为零
要在第一个exit
之后不要finish
,而是要找到start
至finish
的所有情况,请重置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
规则,因此我组合设置了所有变量)
现在所有start
至finish
部分将以相同的方式输出。
让我知道您是否在要求稍有不同或还有其他问题。
答案 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"}'