AWK - 无法更新文件

时间:2016-09-27 12:40:11

标签: bash awk

我的目录中有300个txt文件,格式如下

 regional_vol_WM_atlas[1-300].txt

    651328 651328
    553949 553949
    307287 307287
    2558 2558       

以下awk脚本应该通过对我目录中每个现有文件的第四行执行计算来创建一个新文件。

#!/bin/bash

awk=/usr/bin/awk

awkcommand='
FNR == 1 {
  newfilename = FILENAME ; sub(".txt", "_prop.txt", newfilename)
  printf "" > newf
ilename
}
FNR == 4 {
  $1=($1/0.824198)*0.8490061
  $2=($2/0.824198)*0.8490061
}
{
  print >> newfilename
}
 'regional_vol_WM_atlas[0-9].txt regional_vol_WM_atlas[0-9][0-9].txt regional_vol_WM_atlas1[0-4][0-9].txt regional_vol_WM_atlas15[02].txt

不幸的是我无法更新目录中的任何文件,当我运行该文件时,我发生以下错误

dev@dev-OptiPlex-780:/media/dev/Daten/Task1/subject1/t1$ '/media/dev/Daten/Task1/subject1/t1/Method' 

/media/dev/Daten/Task1/subject1/t1/Method: line 18: regional_vol_WM_atlas10.txt: command not found

请你纠正我错在哪里

2 个答案:

答案 0 :(得分:2)

问题是可以为命令分配变量,例如:

x='hello' some_command

实际上bash认为你正在尝试做什么。罪魁祸首是空白,它充当命令分隔符,因此只需转义(带有\的前缀)文件名列表中的空格:

#!/bin/bash

awk=/usr/bin/awk

awkcommand='
FNR == 1 {
  newfilename = FILENAME ; sub(".txt", "_prop.txt", newfilename)
  printf "" > newf
ilename
}
FNR == 4 {
  $1=($1/0.824198)*0.8490061
  $2=($2/0.824198)*0.8490061
}
{
  print >> newfilename
}
 '\ regional_vol_WM_atlas[0-9].txt\ regional_vol_WM_atlas[0-9][0-9].txt\ regional_vol_WM_atlas1[0-4][0-9].txt\ regional_vol_WM_atlas15[02].txt

我唯一改变的是最后一行。

答案 1 :(得分:2)

你的脚本没有调用awk。它定义了一个名为awk的变量,然后尝试在其环境中设置变量regional_vol_WM_atlas10.txt来执行文件awkcommand。唉,那个文件不在你的PATH中,所以bash找不到它。你需要改为:

awk "$awkcommand" file1 file2 ...

(其中file1file2等是您要用作输入的输入文件。)

另请注意,您当前的脚本会将文本文本regional_vol_WM_atlas[0-9].txt附加到awk命令的末尾(或者如果存在与该glob匹配的文件,正在追加该文件的名称),不要。总的来说,你应该写的是:

  #!/bin/bash

    awkcommand='
    FNR == 1 {
      newfilename = FILENAME ; sub(".txt", "_prop.txt", newfilename)
      printf "" > newfilename
    }
    FNR == 4 {
      $1=($1/0.824198)*0.8490061
      $2=($2/0.824198)*0.8490061
    }
    {
      print >> newfilename
    }
    '

    awk "$awkcommand" regional_vol_WM_atlas[0-9].txt \
        regional_vol_WM_atlas[0-9][0-9].txt \
        regional_vol_WM_atlas1[0-4][0-9].txt \
        regional_vol_WM_atlas15[02].txt