这是错误的:
for f in a*.dat; do
awk '.....' file1 "$f" > temp
awk '.....' temp > "$f_out"
done
我想使用 a*.dat 作为输入,然后作为后缀 _out 的输出。非常感谢
答案1
被_
视为变量名称的一部分,因此您使用该变量f_out
而不是f
和 附加out
。使用{}
将解决您的问题。
for f in a*.dat; do
awk '.....' "$f" > "${f}_out"
done
答案2
您需要使用大括号来消除变量
$f
与字符串其余部分 (_out
) 的歧义。ie
$f_out
指的是名为的变量f_out
(可能不存在,因此计算结果为空字符串),而表示附加的${f}_out
变量的值。f
_out
根据您的 awk 脚本正在执行的操作,您可能(几乎可以肯定)不需要运行两次 - 将一个脚本的输出通过管道传输到另一个脚本
awk
几乎没有用,如下:awk
awk
awk '.....' file1 "$f" > temp awk '.....' temp > "${f}_out"
实际上与此相同:
awk '.....' file1 "$f" | awk '.....' > "${f}_out"
最好写成:
awk '{....}; {.....}' "$f" > "${f}_out"
在循环中:
for f in *.dat; do awk '{....}; {.....}' "$f" > "${f}_out" done
顺便说一句,awk
有一个名为“FILENAME”的内置变量,它等于当前正在处理的文件的文件名。这意味着您可能不需要循环for
,只需执行以下操作即可:
awk '{....}; { .... }; { print > FILENAME "_out" }' a*.dat
或者只是确保每个 print 语句都以> FILENAME "_out"
.
如果不确切知道这两个awk
脚本的作用,就不可能比这更具体。
答案3
你的命令应该是这样的:
for f in a*.dat; do
awk '.....' "$f" > "${f}_out"
done
输出需要以这种方式进行,否则 shell 将尝试解释变量
f_out