Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash if和awk循环有条件地粘贴文件_Bash_Loops_If Statement_Awk - Fatal编程技术网

使用bash if和awk循环有条件地粘贴文件

使用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 但是,看起来只有最后粘贴的文件在工具栏中。在不完全覆盖所有数据的情况下,不应该每次

我有一个文件列表,如果满足某些awk条件,我想将其粘贴到主文件(bar)

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“>>”所做的。显然不是这样。你可以想象一个实用程序做你认为粘贴可以做的事情,但是它的效率会更低。请注意,我已向建议的解决方案中添加了建议,以便您可以进一步简化代码(并更正引用)。