【发布时间】:2017-07-05 15:49:37
【问题描述】:
运行此命令失败:
$(printf "awk '{%sprint}'" $(tail -n +2 file.txt | cut -f2 | sort | uniq | awk 'BEGIN{a=1}{printf "gsub(\"%s\",%i);", $1,a++}')) file.txt
它给出了以下错误:
awk: '
awk: ^ invalid char ''' in expression
但是,如果我运行替换的命令,我会得到:
awk '{gsub("ACB",1);gsub("ASW",2);gsub("BEB",3);gsub("CDX",4);gsub("CEU",5);gsub("CHB",6);gsub("CHS",7);gsub("CLM",8);gsub("ESN",9);gsub("FIN",10);gsub("GBR",11);gsub("GIH",12);gsub("GWD",13);gsub("IBS",14);gsub("ITU",15);gsub("JPT",16);gsub("KHV",17);gsub("LWK",18);gsub("MSL",19);gsub("MXL",20);gsub("PEL",21);gsub("PJL",22);gsub("PUR",23);gsub("STU",24);gsub("TSI",25);gsub("YRI",26);print}'
我可以这样运行:
awk '{gsub("ACB",1);gsub("ASW",2);gsub("BEB",3);gsub("CDX",4);gsub("CEU",5);gsub("CHB",6);gsub("CHS",7);gsub("CLM",8);gsub("ESN",9);gsub("FIN",10);gsub("GBR",11);gsub("GIH",12);gsub("GWD",13);gsub("IBS",14);gsub("ITU",15);gsub("JPT",16);gsub("KHV",17);gsub("LWK",18);gsub("MSL",19);gsub("MXL",20);gsub("PEL",21);gsub("PJL",22);gsub("PUR",23);gsub("STU",24);gsub("TSI",25);gsub("YRI",26);print}' file.txt
而且效果很好。我做错了什么?
@ChrisLear 给了我一个可行的解决方案,但我仍然不太明白命令解决方案在做什么。这是工作代码:
$(printf "awk {%sprint}" $(tail -n +2 file.txt | cut -f2 | sort | uniq | awk 'BEGIN{a=1}{printf "gsub(\"%s\",%i);", $1,a++}')) file.txt
{%sprint} 周围的单引号被删除。为什么那些单引号会破坏命令替换?
编辑:将反引号更改为 $(...) 表示法。还添加了我不明白的解决方案。
【问题讨论】:
-
正确的做法是
awk '{gsub("ACB",1);gsub("ASW",2)}'btw 是awk 'BEGIN{split("ACB ASW",m)} {for (i in m) gsub(m[i],i)}'或类似的(取决于您的要求),但这似乎与您的问题无关。 -
@EdMorton 命令是
printf "awk '{%sprint}'" $(...)%s指的是$(...) -
啊,我明白了。我尝试正确格式化您的问题,但您在 printf 行的开头有 3 个刻度,所以我猜您想留下一个,但写下来没有意义 - 请 edit 您的问题显示实际命令行。另外 - 添加简洁、可测试的示例输入和预期输出,因为您所做的事情不太可能是正确的方法(无论“它”是什么),我们可以帮助您走上正确的道路。
-
@EdMorton 我使用额外的反引号来包装长命令,但我想这不是首选格式。
-
stackoverflow.com/questions/18567685/… 可能是一个有用的参考
标签: bash awk command-substitution