Bash 使awk和for语句更智能

Bash 使awk和for语句更智能,bash,for-loop,awk,Bash,For Loop,Awk,我有以下命令(如下),我想在两个方面使其更智能一些: 将for语句缩短,例如: for i in seq `1 22` X; awk '{print $1,$2,'$i',$4-$10,$12-$21}' 这样行吗 让awk声明更聪明一点。比如: for i in seq `1 22` X; awk '{print $1,$2,'$i',$4-$10,$12-$21}' 这将从4中减去第10列的值,从12中减去第21列的值。我希望它打印4到10,等等。我该怎么做 非常感谢 砂光机 下面是

我有以下命令(如下),我想在两个方面使其更智能一些:

将for语句缩短,例如:

for i in seq `1 22` X;
awk '{print $1,$2,'$i',$4-$10,$12-$21}'
这样行吗

让awk声明更聪明一点。比如:

for i in seq `1 22` X;
awk '{print $1,$2,'$i',$4-$10,$12-$21}'
这将从4中减去第10列的值,从12中减去第21列的值。我希望它打印4到10,等等。我该怎么做

非常感谢

砂光机

下面是原始命令

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

{1..22}X中i的
;执行


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

任何时候在shell中编写循环只是为了处理文本,您的方法都是错误的。shell只是一个调用工具的环境,用于通用文本处理的UNIX工具是awk。您的脚本应该如下所示:

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
awk'
开始{

对于(i=1;iYou可以使用
表示i,单位为$(seq 1 22)X;
,其中
$(…)
优于反勾号,命令替换的开始时间在
seq
命令之前。虽然您可以在
awk
中对
print
语句做一些替代,但我认为它们不会更容易理解。我可能会使用
awk-vi=“$I”{print$1,$2,I,$4,…}“
$i
的值输入
awk
脚本。
awk'{$3=$11=“”;print}'
我想你可以试试
awk-vi=“$i”{$3=i;$11=“”;print}'
,这与JJoao的建议类似,也是Etan在回答中的建议。