0

我正在运行一个 shell 脚本,在该脚本下我正在运行在 STDOUT 上写入输出数据的程序,并从那里捕获输出并将其重定向到一个文件中。但是该程序写入了很多数据,当我将其写入文件时需要过滤掉这些数据

test -d $data | grep "^[A-Z]*|[0-9]*" >> $OUT_FILE

现在在第 3 行的这个输出中,我得到一个值,我想检查该值是否小于 43564,然后跳过该行。

test -d $data | grep "^[A-Z]*|[0-9]*" | awk -F "|" 'if($3 >= 43564){print $0}'>> $OUT_FILE

但这对我不起作用,建议我做错了什么

4

2 回答 2

3

能否请您尝试以下,因为没有提供样品,因此无法对其进行测试。作为一个重要的改变,你需要改变=>>=awk状况。然后我还修复了您的if条件,理想情况下,if条件应该在{if(your condition)....}大括号内。

实际上,我们不需要if条件,我们可以简单地运行条件本身,也不需要提及print函数,因为awk适用于regexp/conditionthen的方法,action所以如果这个条件为 TRUE,它将打印该行(因为没有提到任何动作,默认动作awk是打印当前行)。

根据@chepner 评论评论test -d没有向标准输出写入任何内容,因此现在将其更改为条件。

if [[ test -d $data ]]
then
     awk -F "|" '/^[A-Z]*|[0-9]*/ && ($3 >= 43564)' Input_file > $OUT_FILE
else
     echo "Please check $data directory NOT present."
fi

注意:我们需要使用grepwithawk,因为awk它能够检查正则表达式,因为这是 OP 的工作,我将在这里进行 OP 的尝试修复。

于 2020-10-19T13:04:55.063 回答
1

你不能grep输出,test因为它不打印任何东西。

可能你想要

test -d "$data" ||
awk -F "|" '/^[A-Z]*|[0-9]*/ && $3 >= 43564' "$data" >> "$OUT_FILE"

这相当于对初学者更友好

if ! [ -d "$data" ]; then
   awk -F "|" '/^[A-Z]*|[0-9]*/ && $3 >= 43564' "$data" >> "$OUT_FILE"
fi

您几乎从不想通过管道grep连接到 Awk;这是一个非常次要的反模式,但也很容易避免。请参阅无用的grep. 有点类似,{print $0}已经是 Awk 中的默认操作,所以我们可以简单地将其省略,只需指定何时打印的条件。

如果您不想检查该部分中的文件$datathen显然将该部分替换为您要过滤的文件的名称。(请注意正确的引用。)如果您正在过滤标准输入,您可以非常好地取出文件名并管道到整个if表达式。

some complex process which generates this output |
if ! [ -d "$data" ]; then
    awk -F "|" '/^[A-Z]*|[0-9]*/ && $3 >= 43564'
fi >>"$OUT_FILE"
于 2020-10-19T13:18:46.523 回答