循环中的awk条件内部bash

时间:2017-10-09 17:20:36

标签: bash if-statement awk while-loop conditional

我正在尝试创建一个逐行遍历文本文件的while循环,使用Awk测试字段是否为空,然后根据该条件是真还是假来执行操作。

输入文件是:

$ cat testarr.csv
cilantro,lamb,oranges
basil,,pears
sage,chicken,apples
oregano,,bananas
tumeric,turkey,plums
pepper,,guavas
allspice,goose,mangos

我的预期输出是:

this_is_one_iteration
ItIsNotBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsNotBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsNotBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsNotBlank

基于Using 'if' within a 'while' loop in Bash和类似的线程,我这样做了:

#!/bin/bash

error=ItIsBlank
success=ItIsNotBlank
while read LINE; do
echo this_is_one_iteration
QZ1=$(awk -F "," '{print (!$2)}')
if [[ $QZ1==0 ]] ; then
    echo $error
else
    echo $success
fi
done < testarr.csv

给了我:

$ bash testloop.sh
this_is_one_iteration
ItIsBlank

所以它似乎甚至没有遍历文件。但是,如果我取出条件,它就会很好地迭代。

#!/bin/bash

error=ItIsBlank
success=ItIsNotBlank
while read LINE; do
echo this_is_one_iteration
done < testarr.csv

给出:

$ bash testloop.sh
this_is_one_iteration
this_is_one_iteration
this_is_one_iteration
this_is_one_iteration
this_is_one_iteration
this_is_one_iteration
this_is_one_iteration

另外,条件似乎在不使用awk时工作正常:

QZ1=test
while read LINE; do
echo this_is_one_iteration
if [[ $QZ1=="test" ]] ; then
    echo It_worked
fi
done < testarr.csv

给我:

$ bash testloop.sh
this_is_one_iteration
It_worked
this_is_one_iteration
It_worked
this_is_one_iteration
It_worked
this_is_one_iteration
It_worked
this_is_one_iteration
It_worked
this_is_one_iteration
It_worked
this_is_one_iteration
It_worked

2 个答案:

答案 0 :(得分:1)

除了小错误之外,您的脚本是正确的。添加echo $ LINE并将其传递给awk语句。脚本中的awk没有可用的输入。

#!/bin/bash 

error=ItIsBlank
success=ItIsNotBlank
while read LINE; do
echo this_is_one_iteration
QZ1=$(echo $LINE|awk -F "," '{print (!$2)}')
if [[ $QZ1 -eq 0 ]] ; then
 echo $error
else
 echo $success 
fi
done < testarr.csv

当我现在运行脚本时:

[ec2-user@ip check]$ ./script.sh
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration 
ItIsBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsBlank

希望这可以解决您的问题。

答案 1 :(得分:0)

  

使用Awk

测试字段是否为空白

我想,可以通过单个 awk 进程来实现:

awk -F, '{ print "this_is_one_iteration"; f="Not"; 
           for(i=1;i<=NF;i++) if($i=="") { f="";break }; printf "ItIs%sBlank\n",f }' testarr.csv

输出:

this_is_one_iteration
ItIsNotBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsNotBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsNotBlank
this_is_one_iteration
ItIsBlank
this_is_one_iteration
ItIsNotBlank