所以我想根据第8列将一个相当大的文件拆分成几个小文件。所以我写了这个剧本:
#!/bin/bash
run_command(){
eval ${1}
wait
}
chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P")
sampInput=("heyA")
for ((x=0;x<${#chInput[@]};x++));do
com="awk -F'\t' '$8=="${chInput[x]}"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt"
run_command "${com}"
done
但由于
,它无效'$ 8 ==“
awk: ==1
awk: ^ syntax error
awk: ==2
awk: ^ syntax error
awk: ==3
awk: ^ syntax error
awk: ==4
awk: ^ syntax error
但只是做着
awk -F'\t' '$8==1' /home/location/heyA_This_P.txt > Ch1.txt
从命令行开始工作
我该怎么做才能解决这个问题?
答案 0 :(得分:2)
急性问题是双引号;在分配变量时,$8
将被某些东西替代(可能根本没有)。您可以尝试使用带有正确转义的单引号,但真正的解决方案可能是深呼吸并重新开始,而无需在变量中使用eval
或Awk脚本。
这个椒盐卷饼逻辑的目的是什么?您应该阅读http://mywiki.wooledge.org/BashFAQ/050
中的建议,并将其放在首位以下是解决问题的快速尝试:
#!/bin/bash
chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P")
sampInput=("heyA")
for ((x=0;x<${#chInput[@]};x++));do
awk -F'\t' '$8=="'"${chInput[x]}"'"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt
done
特别注意用于在脚本中插入"${chInput[X]}"
的构造(实际上,除了删除变量和eval
之外,这实际上是我唯一改变的东西)。这是一个单引号的字符串,与双引号中的字符串相邻,与单引号中的字符串相邻,在Bash中计算为单个字符串。因此,'foo'"bar"'baz'
评估为foobarbaz
,与'"foo"'
相邻的"'bar'"
评估为"foo"'bar'
。在此处,与'$8=="'
相邻的"${chInput[x]}"
旁边的'"'
评估为$8=="..."
,其中双引号中的内容在分配时被替换。
(你也不需要阵列;你可以做到
for c in "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" \
"13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" \
"A" "D" "P"
do
awk -F'\t' '$8=="'"$c"'"' /home/location/"$sampInput"_This_P.txt > "${sampInput}Ch$c.txt"
done
并与Classic Bourne shell兼容。)