我的目录中有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
请你纠正我错在哪里
答案 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 ...
(其中file1
,file2
等是您要用作输入的输入文件。)
另请注意,您当前的脚本会将文本文本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