首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >制造awk和更聪明的语句

制造awk和更聪明的语句
EN

Stack Overflow用户
提问于 2015-01-15 00:13:56
回答 2查看 202关注 0票数 0

我有以下命令(下面),我想在两个方面使其变得更聪明一些:

缩短for语句,如下所示:

代码语言:javascript
复制
for i in seq `1 22` X;

那能行吗?

让awk语句更聪明一点。类似于:

代码语言:javascript
复制
awk '{print $1,$2,'$i',$4-$10,$12-$21}'

这将减去第10栏的值从4,21从12。我希望它打印4到10,等等。我怎么做呢?

非常感谢!

砂光机

原始命令如下

代码语言:javascript
复制
grep 'alternate_ids' 1000g/aegscombo_pp_1000G_sum_stat_chrX.out > 1000g/aegscombo_pp_1000G_sum_stat_allchr.txt
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 X; 
do
    echo "Grepping data for chromosome: "$i
    tail -n +13 1000g/aegscombo_pp_1000G_sum_stat_chr$i.out | wc -l
    tail -n +13 1000g/aegscombo_pp_1000G_sum_stat_chr$i.out |
        awk '{print $1,$2,'$i',$4,$5,$6,$7,$8,$9,$10,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21}' \
            >> 1000g/aegscombo_pp_1000G_sum_stat_allchr.txt
done
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-15 00:17:46

for i in {1..22} X; do

如果要不打印的字段数量小于要打印的字段数,则可以尝试清空要忽略的字段,然后打印整行。

票数 1
EN

Stack Overflow用户

发布于 2015-01-15 03:46:47

任何时候,只要你在shell中写一个循环来操纵文本,你就会有错误的方法。shell只是一个调用工具的环境,用于通用文本处理的UNIX工具是awk。您的脚本应该如下所示:

代码语言:javascript
复制
awk '
BEGIN {
    for (i=1; i<=22; i++) {
        ARGV[ARGC++] = "1000g/aegscombo_pp_1000G_sum_stat_chr" i ".out"
    }
    ARGV[ARGC++] = "1000g/aegscombo_pp_1000G_sum_stat_chrX.out"
}
NR == FNR {
    if (/alternate_ids/) {
        print
    }
    next
}
FNR == 1{
    chr = FILENAME
    gsub(/^.*chr|\.out$/,"",chr)
    print "Grepping data for chromosome:", chr | "cat>&2"
}
{
    for (i=1; i<=21; i++) {
        printf "%s%s", (i==3?chr:$i), (i<21?OFS:ORS)
    }
}
' 1000g/aegscombo_pp_1000G_sum_stat_chrX.out > 1000g/aegscombo_pp_1000G_sum_stat_allchr.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27954832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档