Bash:无法使用计算识别带范围的文件名

时间:2016-02-25 09:33:24

标签: linux bash shell awk sed

我正在尝试使用awk进行多个文件计算:awk average same column in multiple files(with certain range)

awk正在尝试从我的范围avg_x.{1..1000}.dat获取文件列表。 现在,我发现了一个问题。如果我明确写出范围:

awk ' {a[$1]+=$8;b[$1]++;}END{for(i=1;i<=(FNR-1);i++)print i,a[i]/b[i];}' avg_x.{1..1000}.dat

完美无缺。 但是,如果我在使用bash表达式中添加一些计算,它就不起作用了:

i=0
interval=1000    
awk ' {a[$1]+=$8;b[$1]++;}END{for(i=1;i<=(FNR-1);i++)print i,a[i]/b[i];}' avg_x.{$((i+1))..$((i+interval))}.dat

它返回错误:

awk: can't open file avg_x.{1..1000}.dat

注:

让我们更容易: 即使我cp avg_x.{$((i+1))..$((i+interval))}.dat test/.它返回:

cp: avg_x.{0..1000}.dat: No such file or directory

2 个答案:

答案 0 :(得分:1)

你可以在循环中做这样的事情

$ls abcd*
abcd1.txt  abcd2.txt  abcd3.txt  abcd4.txt  abcd5.txt  abcd6.txt  abcd7.txt  
$ regex=$(echo $(seq $((i+1)) $((i+2)) | paste -s -d '|' | sed 's/^/(/g;s/$/)/g'))
$ echo $regex
(2|3)
$ find . -maxdepth 1 -type f -iname "abcd*" | sed -n -r '/^\.\/abcd'$regex'/p'
./abcd3.txt
./abcd2.txt

将上述命令的输出存储到数组中,并使用&#34; $ {array [*]}&#34;展开它。将其传递给awk

答案 1 :(得分:1)

这样做的一种可能方法是通过基本命令的可怕混合。

i=10
interval=20
awk '<your script here>' $(yes '' | awk '{printf("avg_x%d.dat\n", FNR)}' |\
head -n  $(( $i + $interval )) | tail -n $(( 1 + $interval )) )

我们可以使用echo代替awk轻松演示这一点(我添加了一些换行符以使其更具可读性):

$ i=20
$ interval=10
$ echo $(yes '' | awk '{printf("avg_x%d.dat\n", FNR)}' | 
  head -n  $(( $i + $interval )) | tail -n $(( 1 + $interval )) )
avg_x20.dat avg_x21.dat avg_x22.dat avg_x23.dat avg_x24.dat avg_x25.dat 
avg_x26.dat avg_x27.dat avg_x28.dat avg_x29.dat avg_x30.dat