awk - 了解 awk 脚本
问题描述
我有以下 awk 脚本,我不明白它的作用或如何正确执行它。
$ awk 'BEGIN{
first_start=$2;
old_start=first_start;
}
{
chr=$1;
current_start=$2;
if (current_start > (old_start + 1)) {
print chr"\t"first_start"\t"old_start;
first_start=current_start;
old_start=first_start;
}
else {
old_start=current_start;
}
}
END {
print chr"\t"first_start"\t"old_start;
}' pileup.txt
输入格式应为:
NC_000001.10 11456 A 0 * *
NC_000001.10 11467 A 1 , E
NC_000001.10 250133 t 2 .. EA
NC_000001.10 250164 t 2 .. EE
NC_000001.10 250169 t 2 .. EE
我试图用它来执行它awk -f pileup_to_bed.awk
并得到
awk: pileup_to_bed.awk:1: $ awk 'BEGIN{
awk: pileup_to_bed.awk:1: ^ invalid char ''' in expression
awk: pileup_to_bed.awk:1: $ awk 'BEGIN{
awk: pileup_to_bed.awk:1: ^ syntax error
解决方案
当您将代码放在.awk
文件中时,您不需要引用'
代码(据我了解问题),它应该像(awk
文件名是script.awk
)。我正在删除BEGIN{first_start=$2;old_start=first_start}
,因为将其保留在BEGIN
部分中是没有意义的,因为其中没有读取任何行,感谢 Ed sir 在这里指出。
{
chr=$1;
current_start=$2;
if (current_start > (old_start + 1)) {
print chr"\t"first_start"\t"old_start;
first_start=current_start;
old_start=first_start;
}
else {
old_start=current_start;
}
}
END {
print chr"\t"first_start"\t"old_start;
}
当我在上面运行时:
awk -f script.awk Input_file
我得到以下输出:
NC_000001.10
NC_000001.10 11456 11456
NC_000001.10 11467 11467
NC_000001.10 250133 250133
NC_000001.10 250164 250164
NC_000001.10 250169 250169
推荐阅读
- sql - 为什么使用索引但sql仍然很慢
- android - 如何让 Flutter 抽屉在里面有 Dismissible 时关闭?
- kubernetes - 如何配置 Helm Chart 的 Ingress 文件来部署 gRPC 服务?
- angular - 地理位置在浏览器中有效,但在设备上显示 PositionError
- c++ - 没有重载函数“std::make_unique”的实例与参数列表匹配,但适用于 unique_ptr 构造函数
- excel - vba 未访问共享点站点使用 FSO 出现错误
- swiftui - SwiftUI 相当于 apportionsSegmentWidthsByContent?
- python - 基类可以访问父类的方法吗
- javascript - 如何在 JavaScript 中迭代多个异步等待函数并链接在一起?
- laravel - 如何使用 vue.js 从 laravel 关系中查询数据?[拉拉维尔,vue]