awk 命令因命令替换而失败
awk command fails with command substitution
运行 此命令失败:
$(printf "awk '{%sprint}'" $(tail -n +2 file.txt | cut -f2 | sort | uniq | awk 'BEGIN{a=1}{printf "gsub(\"%s\",%i);", ,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);", ,a++}')) file.txt
{%sprint}
周围的单引号被删除。为什么那些单引号会破坏命令替换?
编辑:将反引号更改为 $(...)
表示法。还添加了我不明白的解决方案。
尝试从正在生成的命令中删除引号。
`printf "awk {%sprint}" $(tail -n +2 file.txt | cut -f2 | sort | uniq | awk 'BEGIN{a=1}{printf "gsub(\"%s\",%i);", ,a++}')` file.txt
有关解释,请参阅 Why does command substitution change how quoted arguments work?
中已接受的答案
您似乎正试图从第 2 行开始的文件中获取一堆唯一的第二个字段,并根据它们的字母顺序将它们映射到数字,然后将更改应用到同一个文件。如果是这样,那么使用 GNU awk for sorted_in 并就地编辑将是:
awk -i inplace '
NR==FNR {
if (NR>1) {
map[]
}
next
}
FNR==1 {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (str in map) {
map[str] = ++i
}
}
{
= map[]
print
}
' file.txt
如果这不是您所需要的,请编辑您的问题以显示简明、可测试的样本输入和预期输出。
运行 此命令失败:
$(printf "awk '{%sprint}'" $(tail -n +2 file.txt | cut -f2 | sort | uniq | awk 'BEGIN{a=1}{printf "gsub(\"%s\",%i);", ,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);", ,a++}')) file.txt
{%sprint}
周围的单引号被删除。为什么那些单引号会破坏命令替换?
编辑:将反引号更改为 $(...)
表示法。还添加了我不明白的解决方案。
尝试从正在生成的命令中删除引号。
`printf "awk {%sprint}" $(tail -n +2 file.txt | cut -f2 | sort | uniq | awk 'BEGIN{a=1}{printf "gsub(\"%s\",%i);", ,a++}')` file.txt
有关解释,请参阅 Why does command substitution change how quoted arguments work?
中已接受的答案您似乎正试图从第 2 行开始的文件中获取一堆唯一的第二个字段,并根据它们的字母顺序将它们映射到数字,然后将更改应用到同一个文件。如果是这样,那么使用 GNU awk for sorted_in 并就地编辑将是:
awk -i inplace '
NR==FNR {
if (NR>1) {
map[]
}
next
}
FNR==1 {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (str in map) {
map[str] = ++i
}
}
{
= map[]
print
}
' file.txt
如果这不是您所需要的,请编辑您的问题以显示简明、可测试的样本输入和预期输出。