man*_*oth 1 bash awk loops if-statement
如果满足某些awk条件,我有一个要粘贴到主文件(bar)的文件列表.
for foo in *;
do
if awk '*condition* {exit 1}' $foo
then
:
else
paste $foo > bar
fi
done
Run Code Online (Sandbox Code Playgroud)
但是,看起来只有最后粘贴的文件在栏中.不应该每次都粘贴添加新列到bar,而不是完全覆盖所有数据?
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
Run Code Online (Sandbox Code Playgroud)
您的paste命令会bar在循环中的每次迭代时覆盖文件,这说明最后您只有最后一个文件.
declare -a FILES=()
for foo in *;
do
if awk '*condition* {exit 1}' $foo
then
:
else
FILES+=("$foo")
fi
done
paste "${FILES[@]}" > bar
Run Code Online (Sandbox Code Playgroud)
此代码在名为的数组中累积与您的条件匹配的所有文件名FILES,并且paste只调用一次,将所有文件名扩展为单独的引用参数(这是做什么"${FILES[@]}")并将输出重定向到bar文件.
此外,您可以使用以下命令替换整个if/then/else块:
awk '*condition* {exit 1}' "$foo" || FILES+=("$foo")
Run Code Online (Sandbox Code Playgroud)
该||表达的条件,因为击的执行逻辑运算符的惰性评估,该声明的权利,如果只执行awk返回一个非零返回代码.
请注意我引用"$foo"(当传递给它awk)时,文件名将包含特殊字符.
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |