2017-10-09 59 views
0

我想做一個逐行掃描文本文件的while循環,使用awk測試一個字段是否空白,然後根據這個條件是true還是false來做一個動作。awk有條件的內部bash while循環

輸入文件是這樣的:

$ 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 
+0

所以你想在'bash'腳本或'Awk'命令中做到這一點? – Inian

+0

我不在乎。我只需要測試一個字段是否是空白的,然後根據它來做bash的東西。爲什麼它不能將awk的輸出傳遞給bash? – Thoughtcraft

+0

_proper_行是3個字段,不正確的行少於3個? – Inian

回答

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 

當我現在運行腳本:

[[email protected] 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 

希望這會解決您的問題。

+0

謝謝,這幾乎工作,但==運營商沒有在這方面的工作,而是我用-eq,並給了預期的輸出 – Thoughtcraft

+0

很高興它的工作。如果問題解決,請關閉線程。我編輯了答案,以防其他人遇到相同的問題 –

+1

問題不是'=='與'-eq',而是您需要操作員周圍的空間。 '=='(或'=')測試字符串是否相等,'-eq'測試數字是否相等。在這種情況下,兩者都可以工作。 –

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 
+0

但是,這將允許真相測試的結果執行bash代碼嗎?我的意思並不是打印出「ItIsBlank」,我只是將它作爲一種測試,將其發送給bash。 – Thoughtcraft