使用bash if和awk循环有条件地粘贴文件
我有一个文件列表,如果满足某些awk条件,我想将其粘贴到主文件(bar)使用bash if和awk循环有条件地粘贴文件,bash,loops,if-statement,awk,Bash,Loops,If Statement,Awk,我有一个文件列表,如果满足某些awk条件,我想将其粘贴到主文件(bar) for foo in *; do if awk '*condition* {exit 1}' $foo then : else paste $foo > bar fi done 但是,看起来只有最后粘贴的文件在工具栏中。在不完全覆盖所有数据的情况下,不应该每次
for foo in *;
do
if awk '*condition* {exit 1}' $foo
then
:
else
paste $foo > bar
fi
done
但是,看起来只有最后粘贴的文件在工具栏中。在不完全覆盖所有数据的情况下,不应该每次都将新列粘贴到条中吗
File1 File2 Expected_Output Actual_Output
1 4 1 NaN 1 4 1 NaN 1 NaN
2 5 2 7 2 5 2 7 2 7
3 6 3 8 3 6 3 8 3 8
您的
paste
命令在循环的每次迭代中都会覆盖文件bar
,这说明在循环结束时,您只有最后一个文件
declare -a FILES=()
for foo in *;
do
if awk '*condition* {exit 1}' $foo
then
:
else
FILES+=("$foo")
fi
done
paste "${FILES[@]}" > bar
此代码在名为FILES
的数组中累加与您的条件匹配的所有文件名,并仅调用一次粘贴
,将所有文件名扩展为单个带引号的参数(这就是“${FILES[@]}”
所做的),并将输出重定向到条形图
文件
此外,您可以将整个if/then/else块替换为:
awk '*condition* {exit 1}' "$foo" || FILES+=("$foo")
|
表示一个条件,由于Bash对逻辑运算符执行延迟求值,因此只有当awk
返回非零返回代码时,才会执行右侧的语句
请注意,我引用了
“$foo”
(在将其传递给awk
时),用于文件名包含特殊字符的情况。您的粘贴
命令在循环的每次迭代中都会覆盖文件栏
,这说明最后您只有最后一个文件
declare -a FILES=()
for foo in *;
do
if awk '*condition* {exit 1}' $foo
then
:
else
FILES+=("$foo")
fi
done
paste "${FILES[@]}" > bar
此代码在名为FILES
的数组中累加与您的条件匹配的所有文件名,并仅调用一次粘贴
,将所有文件名扩展为单个带引号的参数(这就是“${FILES[@]}”
所做的),并将输出重定向到条形图
文件
此外,您可以将整个if/then/else块替换为:
awk '*condition* {exit 1}' "$foo" || FILES+=("$foo")
|
表示一个条件,由于Bash对逻辑运算符执行延迟求值,因此只有当awk
返回非零返回代码时,才会执行右侧的语句
请注意,我引用了
“$foo”
(将其传递给awk
)以说明您的文件名可能包含特殊字符。注意,您正在使用粘贴$foo>bar
,这将删除bar
中以前的任何内容。您可能想使用>
进行追加。注意,您正在使用粘贴$foo>bar
,这将删除bar
中以前的任何内容。您可能想使用>
进行追加。谢谢,这非常优雅地解决了问题。我认为在每次迭代之后,粘贴命令应该只向文件中添加新列,类似于bash append“>>”所做的。显然不是这样。你可以想象一个实用程序做你认为粘贴可以做的事情,但是它的效率会更低。请注意,我已经在建议的解决方案中添加了建议,以便您可以进一步简化代码(并更正引用)。谢谢,这非常优雅地解决了问题。我认为在每次迭代之后,粘贴命令应该只向文件中添加新列,类似于bash append“>>”所做的。显然不是这样。你可以想象一个实用程序做你认为粘贴可以做的事情,但是它的效率会更低。请注意,我已向建议的解决方案中添加了建议,以便您可以进一步简化代码(并更正引用)。