繁体   English   中英

无法使用变量扩展名在bash循环中分配正确的文件名

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM