Bash 如果在脚本中处理文件,如何保存文件名
我有88个文件夹,每个文件夹都包含文件“pair.number.”(pair.3472、pair.7829等)。我需要用awk处理文件以提取第二列,但我需要保存数字。如果我尝试: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* 感谢您的提示。有几种方法可以做到这
#!/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
获取basenamefname
。然后将$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*