2010-01-06 83 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