当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用bashif和awk循环有条件地粘贴文件》经验,为你挑选了1个好方法。

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

for foo in *; 
do 
  if awk '*condition* {exit 1}' $foo   
  then                               
    :                        
  else 
    paste $foo > bar 
  fi 
done

但是,看起来只有最后粘贴的文件在栏中.不应该每次都粘贴添加新列到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

Fred.. 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,并且paste只调用一次,将所有文件名扩展为单独的引用参数(这是做什么"${FILES[@]}")并将输出重定向到bar文件.

此外,您可以使用以下命令替换整个if/then/else块:

awk '*condition* {exit 1}' "$foo" || FILES+=("$foo")

||表达的条件,因为击的执行逻辑运算符的惰性评估,该声明的权利,如果只执行awk返回一个非零返回代码.

请注意我引用"$foo"(当传递给它awk)时,文件名将包含特殊字符.



1> Fred..:

您的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,并且paste只调用一次,将所有文件名扩展为单独的引用参数(这是做什么"${FILES[@]}")并将输出重定向到bar文件.

此外,您可以使用以下命令替换整个if/then/else块:

awk '*condition* {exit 1}' "$foo" || FILES+=("$foo")

||表达的条件,因为击的执行逻辑运算符的惰性评估,该声明的权利,如果只执行awk返回一个非零返回代码.

请注意我引用"$foo"(当传递给它awk)时,文件名将包含特殊字符.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有