2010-01-06 69 views
2

我想寫一個腳本來分析程序中的字段並將它們打印到標準輸出。回聲消除反斜槓字符

輸入文件數據是這樣

FIELD1 FIELD2

字段由製表符

分離最初,我試圖將它寫在AWK。

cat test.txt | while read line; do entity=`awk -F "\t" '{print $2}'`;echo $entity; done 

這可以在命令行上正常工作。

但是當我嘗試做同樣的shell程序如下

while read line 
do 
     entity=`echo $line|awk -F \t '{print $2}'` 
     echo $entity 
done<"test.txt" 

原因是回聲$線實際打印標籤的空間。我不能使用空格,因爲字段實際上可以包含空格。

然後我試着用剪寫。

while read line 
do 
     entity=`echo $line|cut -f5` 
     echo $entity 
done<"test.txt" 

再次與回聲相同的問題。

有沒有人遇到過類似的問題。任何解決方案,你可以推薦我。

謝謝。 巴拉

+0

顯示實際的樣本數據,你想要做什麼。描述你的輸出 – ghostdog74 2010-01-06 04:54:12

回答

2

有限的信息,嘗試這種

while read -r line 
do 
     entity=$(echo "$line"|cut -f5) 
     echo "$entity" 
done<"test.txt" 
+0

這爲我工作..謝謝。 – Boolean 2010-01-07 21:31:49

4

當你有一個標籤一個變量,然後嘗試呼應變量:

line=$'f1\tf2\tf3' 
echo ${line} 

正在發生的事情是,外殼處理的標籤作爲參數分隔符,並給予迴音多個參數。回聲本身從未看到選項卡

如果要保留選項卡,則需要將該行看作單個參數。爲了做到這一點,還擴大了變數,你需要圍繞變量用雙引號:

echo "${line}" 

現在,這將發送具有標籤在它的一個參數。

這意味着你應該寫你的腳本是這樣的:

while read line; do 
    entity=$(echo "$line" | awk -F \t '{print $2}') 
    echo $entity 
done < test.txt 
+0

其實我試過這個,但只有在-r選項後才能讀取它。因爲文本必須是原始的。 – Boolean 2010-01-07 21:32:43