Bash 如果在脚本中处理文件,如何保存文件名

Bash 如果在脚本中处理文件,如何保存文件名,bash,awk,scripting,Bash,Awk,Scripting,我有88个文件夹,每个文件夹都包含文件“pair.number.”(pair.3472、pair.7829等)。我需要用awk处理文件以提取第二列,但我需要保存数字。如果我尝试: #!/bin/bash for i in {1..88}; do awk '{print $2}' ~/Documents/attempt.$i/pair* > ~/Results/pred.pair* done 它不保存数字,但只提供一个文件:pred.pair* 感谢您的提示。有几种方法可以做到这

我有88个文件夹,每个文件夹都包含文件“pair.number.”(pair.3472、pair.7829等)。我需要用awk处理文件以提取第二列,但我需要保存数字。如果我尝试:

#!/bin/bash
for i in {1..88}; do 
    awk '{print $2}' ~/Documents/attempt.$i/pair* > ~/Results/pred.pair*
done
它不保存数字,但只提供一个文件:
pred.pair*


感谢您的提示。

有几种方法可以做到这一点:
awk
有一个
FILENAME
变量,您可以将
awk
脚本中的输出重定向到基于
FILENAME
的操纵字符串

或者您可以使用
bash

for i in {1..88}; do
  to_be_processed_fname=$(ls ~/Documents/attempt.$i/pair*)
  extension="${to_be_processed_fname/*./}"   
  awk '{print $2}' "${to_be_processed_fname}" > "$HOME/Results/pred.${extension}"
done
现在,如果同一目录中有多个
pair*
文件,上述操作当然会失败。但我把这个留给你了

#!/bin/bash
for i in {1..88}; do 
    awk '{fname=FILENAME;sub(".*/", "", fname);print $2 > ("~/Results/pred."fname)}' ~/Documents/attempt.$i/pair*
done
使用AWK内置变量
FILENAME
。我们需要从
FILENAME
获取basename
fname
。然后将
$2
值重定向到
“~/Results/pred.”fname
您不需要循环(请查看为什么这是一件好事):


始终引用shell变量,除非您有特定的目的,不引用它们并完全理解所有含义()。使用
$(…)
而不是不推荐的反勾号()。避免在shell()中编写循环。
awk '
    FNR==1 { close(out); out=FILENAME; sub(/\/Documents.*\//,"/Results/pred.",out) }
    { print $2 > out }
' ~/Documents/attempt.{1..88}/pair*