2015-01-15 34 views
0

我有下面的命令(下圖)這是我喜歡做一個有點聰明表現在兩個方面:使得AWK和聲明聰明

獲取for語句更短,像:

for i in seq `1 22` X; 

會那工作?

讓awk語句更聰明一點。喜歡的東西:

awk '{print $1,$2,'$i',$4-$10,$12-$21}' 

將從4列減去10的值,和21 12,我希望它通過10打印4,等我該怎麼辦呢?

非常感謝!

桑德

原始命令低於

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 
+0

你可以使用'for $ in $(seq 1 22)X;''$'(...)'優先反向打勾並打開命令替換在'seq'命令之前。儘管你可以在'awk'中做一些'print'語句的替代,我不認爲它們會更容易理解。我可能會使用'awk -v i =「$ i」'{print $ 1,$ 2,i,$ 4,...}''將'$ i'的值放入'awk'腳本中。 –

+0

'awk'{$ 3 = $ 11 =「」; print}'' – JJoao

+1

我想你可以試試'awk -v i =「$ i」'{$ 3 = i; $ 11 =「」;打印}「,這與JJoao的建議類似,是Etan在他的回答中提出的。 –

回答

1

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

如果不打印字段數比字段的數量較小的打印,你可以嘗試放空,你想要的字段忽略然後打印整行。

1

無論何時你在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