使 awk 和 for 语句更智能
making awk and for statement smarter
我有以下命令(如下),我想在两个方面使其更智能:
缩短 for 语句,例如:
for i in seq `1 22` X;
这样行吗?
并使 awk 语句更智能一些。类似于:
awk '{print ,,'$i',-,-}'
这将从 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 ,,'$i',,,,,,,,,,,,,,,,,}' \
>> 1000g/aegscombo_pp_1000G_sum_stat_allchr.txt
done
for i in {1..22} X; do
如果不打印的字段数小于要打印的字段数,您可以尝试清空要忽略的字段,然后打印整行。
任何时候你在 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
我有以下命令(如下),我想在两个方面使其更智能:
缩短 for 语句,例如:
for i in seq `1 22` X;
这样行吗?
并使 awk 语句更智能一些。类似于:
awk '{print ,,'$i',-,-}'
这将从 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 ,,'$i',,,,,,,,,,,,,,,,,}' \
>> 1000g/aegscombo_pp_1000G_sum_stat_allchr.txt
done
for i in {1..22} X; do
如果不打印的字段数小于要打印的字段数,您可以尝试清空要忽略的字段,然后打印整行。
任何时候你在 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