[英]Can't assign proper filenames in bash loop using variable extension
我被困在这个问题上。 我正在使用循环将每个文件上的命令迭代到特定目录。 在使用文件的原始名称来生成新文件时,使用变量扩展名,仅当变量之前没有文本时才起作用。 我有以下代码:
for f in temp/temp_orfs/* ; do
wc -l $f > ${f}_temp
gawk '{print $1}' ${f}_temp > temp/temp_orfs/num_${f}_text
done
${f}_temp ---> exists
num_${f}_text --> doesn't exists
我做错了什么?
f
包含temp/temp_orfs
前缀,而不仅仅是目录中文件的名称。 假设f
扩展为temp/temp_orfs/foo
; 然后
${f}_temp
扩展为temp/temp_orfs/foo_temp
temp/temp_orfs/num_${f}_text
扩展为temp/temp_orfs/num_temp/temp_orfs/foo_text
您要使用基本名称:
for f in temp/temp_orfs/*; do
bf=${f##*/}
wc -l "$bf" | gawk '{print $1}' > "temp/temp_orfs/num_${bf}_text"
done
或者,您可以简单地首先更改目录:
cd temp/temp_orfs
for f in *; do
wc -l "$f" | gawk '{print $1}' > "temp/temp_orfs/num_${f}_text"
(无论哪种方式,都不需要临时文件,但是如果您确实需要临时文件,请确保注意其名称,以便您知道在何处创建该文件。)
awk
可能不是必需的。 您可以使用输入重定向来使wc
输出仅占行数,尽管结果的格式可能略有不同,具体取决于您使用的wc
实现方式:
# GNU wc
$ wc -l < some_some_file
21
# BSD wc
$ wc -l < some_small_file
21
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.