在特定列的任何行中移动值超过阈值的文件

莎拉

我在特定文件夹中有大量文件。我只想将这些文件移动到子文件夹中,前提是它们在第4列的任何行中至少具有大于0.5的值。在一个单独的命令中,我想这样做,但对于具有至少2行且其值大于3的文件0.5在第4列中

这是文件的常规格式(带标题):

col1  col2  col3  col4  col5  col6
ABC   DEF   5.10  0.94  GHI   JKL
MNO   PQR   8.31  0.37  STU   VWX
ABC   DEF   6.49  0.84  GHI   JKL
MNO   PQR   3.32  0.21  STU   VWX

第4栏中的一些数字采用科学计数法:8.934553871039306e-05

到目前为止,下面的代码是我尝试移动第4列中大于0.5的至少1个值的文件的方法。它最终将每个文件移动到子文件夹中,即使是不符合条件的文件。

#!/bin/bash

find . -type f -exec awk '$4 >= 0.5' {} \; -exec mv -n {} ./NewFolder/ \;

博多

为了使您的命令起作用awk,如果找到匹配项,则必须使用代码0退出;如果找不到匹配项,则必须使用非零退出代码。

除此之外,您应该跳过第一行,因为会将非数字值作为字符串进行比较,这可能会导致意外的匹配。

find . -type f -exec awk 'FNR==1 {next} $4 >= 0.5 {found=1; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

注意:如果awk脚本被多个文件调用,则退出代码表示在任何文件中都找到了匹配项。find命令将确保一次仅将一个文件传递给awk,因此在这里这不是问题。

第二次编辑:

要选择具有至少2个匹配行的文件,您可以对匹配进行计数。

find . -type f -exec awk 'FNR==1 {next} $4 >= 0.5 {found++; if(found >= 2) exit} END {exit found >= 2}' {} \; -exec mv -n {} ./NewFolder/ \;

编辑:

要调试脚本在第4列中移动不具有匹配值的文件的问题,可以向awk脚本中添加代码以打印有关匹配行的信息。如果找到匹配项,以下代码将打印文件名,行号和匹配行。

find . -type f -exec awk 'FNR==1 {next} $4 >= 0.5 {found=1; printf "%s:%d:%s\n", FILENAME, FNR, $0; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

你会得到类似的东西

threshold.txt:2:ABC   DEF   5.10  0.94  GHI   JKL

我建议首先执行此操作以查找问题的原因。

如果在第4列中有行包含非数字文本,则将值作为文本进行比较。这将导致例如"abc"大于"0.5"

另一个可能的原因可能是一行的第1列或第2列中有空格,这将导致错误地将文本分配给各列。

如果有在列4个非数值和要忽略这些行,您可以通过添加值来强制数字解释00 + $4

find . -type f -exec awk 'FNR==1 {next} 0 + $4 >= 0.5 {found=1; printf "%s:%d:%s\n", FILENAME, FNR, $0; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

如果问题的原因是您的字段由制表符分隔并且值可以包含空格,则可以指定字段分隔符(-F "\t")。以下脚本将此与其他修改结合在一起。

find . -type f -exec awk -F "\t" 'FNR==1 {next} 0 + $4 >= 0.5 {found=1; printf "%s:%d:%s\n", FILENAME, FNR, $0; exit} END {exit !found}' {} \; -exec mv -n {} ./NewFolder/ \;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章