2016-11-09 13 views
1

我和新來砸腳本,並有製表delimted文本文件,下面的列如果-conditionw用「+」和「 - 」符號在bash

A234 + - 
B654 - + 
C630 + + 
D707 - - 

我想比較遍歷的每一行文件和比較第二和第三列獲得一個輸出像在一個文本文件

A234 Plus and Minus 
B654 Minus and Plus 
C630 Plus and Plus 
D707 Minus and Minus 

這裏下面是我的bash腳本

#!/bin/bash 
filename="$1" 
while read line; 
do 
g_symbol=$(echo $line | awk '{print $2}') 
t_symbol=$(echo $line | awk '{print $3}') 
if [[($g_symbol == "+") && ($t_symbol == "-")]] 
then 
echo $filename "PLus and Minus" 
elif [[($g_symbol == "-") && ($t_symbol == "-")]] 
then 
echo $filename "Minus and Minus" 
elif [[($g_symbol == "-") && ($t_symbol == "+")]] 
then 
echo $filename "Minus and Plus" 
else 
echo $filname "Plus and Plus" 
fi 
done < "$filename" 

但是當我執行它時,出現以下錯誤

[[(+: command not found 
[[(-: command not found 
[[(-: command not found 
[[(+: command not found 

請引導我。

+1

你有你的測試語法錯誤。在'[[($ g_symbol ==「+」)&&($ t_symbol ==「 - 」)]]'你忘了空格。你需要編寫'[[($ g_symbol ==「+」)&&($ t_symbol ==「 - 」)]]''。您需要在所有其他測試中添加這些空格。另外,我不認爲'[[]]'測試處理嵌套測試。 – Aserre

+1

這可能會更快,而不是'awk',而是'read id g_symbol t_symbol'。 – choroba

+0

@choroba如何在不使用awk的情況下將2列和3列的值存儲到各個變量中。請引導我。我是bash的新手 – Chudar

回答

1

您不需要多次(或根本)運行awk來提取每行中的字段。但是,您的錯誤是因爲您沒有在[[]]附近輸入空格。儘管包含非字母字符的關鍵字,但它們不屬於if語句的語法部分。

#!/bin/bash 
filename="$1" 
while IFS=$'\t' read first g_symbol t_symbol; 
do 
    if [[ ($g_symbol == "+") && ($t_symbol == "-") ]] 
    then 
    echo $filename "PLus and Minus" 
    elif [[ ($g_symbol == "-") && ($t_symbol == "-") ]] 
    then 
    echo $filename "Minus and Minus" 
    elif [[ ($g_symbol == "-") && ($t_symbol == "+") ]] 
    then 
    echo $filename "Minus and Plus" 
    else 
    echo $filname "Plus and Plus" 
    fi 
done < "$filename" 

一個case說法可能更簡單:

#!/bin/bash 
filename="$1" 
while IFS=$'\t' read first g_symbol t_symbol; 
do 
    case "$g_symbol $t_symbol" in 
    "+ -") echo "$filename" "PLus and Minus" ;; 
    "- -") echo "$filename" "Minus and Minus" ;; 
    "- +") echo "$filename" "Minus and Plus" ;; 
    "+ +") echo "$filname" "Plus and Plus" ;; 
    *) echo "$filename" "Something else" ;; 
    esac 
done < "$filename" 
0

正如評論所說,你最好

下面是一個例子使用sed使用sedawk此...:

sed 's/\s*\([+-]\)\s*\([+-]\)/ \1 and \2/; # Add the ' and ' keyword and strip spaces 
    s/\+/Plus/g;       # Replace '+' by string 'Plus' 
    s/-/Minus/g       # Replace '-' by string 'Minus' 
' file      
1

更容易用awk做的事:

awk 'BEGIN{a["+"]="Plus"; a["-"]="Minus"} {print $1, a[$2], "and", a[$3]}' file 

A234 Plus and Minus 
B654 Minus and Plus 
C630 Plus and Plus 
D707 Minus and Minus 
-2

試試這個:

#!/bin/bash 
filename="$1" 
while read line; 
do 
FirstColomn=$(echo $line | awk '{print $1}') 
g_symbol=$(echo $line | awk '{print $2}') 
t_symbol=$(echo $line | awk '{print $3}') 
OutPutFileName="Output.txt" 
if [[($g_symbol == "+") && ($t_symbol == "-")]] 
then 
echo $FirstColomn" PLus and Minus" >>$OutPutFileName 
elif [[($g_symbol == "-") && ($t_symbol == "-") ]] 
then 
echo $FirstColomn " Minus and Minus" >>$OutPutFileName 
elif [[($g_symbol == "-") && ($t_symbol == "+")]] 
then 
echo $FirstColomn " Minus and Plus" >>$OutPutFileName 
else 
echo $FirstColomn " Plus and Plus" >>$OutPutFileName 
fi 
done < $filename 
+0

您是否親自嘗試過?在您糾正之前,您不應該將其推薦給任何人,即使如此,您也應該解釋問題以及您的解決方案如何解決該問題。 –