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

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)

Fre*_*red 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
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)时,文件名将包含特殊字符.