先介绍下环境:在一个文件中,有空格有tab,现想用awk工具实现已tab分割出来第一域,第二域等。
[root@test]# cat list
1 2 3 4
其中1到2之间为空格,2到3,3到4之间为tab
[root@test]# cat test.sh
#!/bin/sh
while read line
do
one=$(echo $line |awk -F"\t" '{print $1}')
echo $one
echo $line
done<list
执行上面的脚本
[root@test]# ./test.sh
1 2 3 4
1 2 3 4
从上面的执行结果可以看出,并没有以tab进行分割。
但是直接在命令行输入awk命令可实现这种需求:
[root@test]# cat list |awk -F"\t" '{print $1}'
1 2
这是为什么?请问如何实现这种有空格和tab的文件,以tab进行分割域的需求!
第1个回答 2013-09-19
你先试试在这么做:echo `cat list`
然后你仔细看看你脚本里面 `echo $line` 的结果
然后你试试自己总结一下,为什么会脚本会输出这样的结果
想不到再留言给我吧
cat会输出文件原本的样子。本回答被提问者采纳
然后你仔细看看你脚本里面 `echo $line` 的结果
然后你试试自己总结一下,为什么会脚本会输出这样的结果
想不到再留言给我吧
cat会输出文件原本的样子。本回答被提问者采纳
第2个回答 2013-09-19
-F "\t" 是你制定了tab为分隔符
空格当然是无视的,$1就是应该是1 2追问
空格当然是无视的,$1就是应该是1 2追问
我也觉的应该是这样,但是事实不是这样,所以比较纳闷!您可以试试在脚本中写就有问题,在console写就ok。
第3个回答 2013-09-19
多测试
在用shell进行字符串截断时常常会出现一些意想不到的状况,总结了以下,大部分情况是使用的echo命令导致的。
cat,read等命令读入tab delimited文本,然后用echo输出的时候,文本里面的tab会变成space空格,所以在你尝试以tab为分隔符分割文本的时候要特别注意这种情况。
事实上,echo除了 -n options 之外,常用选项还有:
-e:启用反斜线控制字符的转换
-E:关闭反斜线控制字符的转换(预设如此)
-n:取消行末之换行符号(与 -e 选项下的 \c 字符同意)
在用shell进行字符串截断时常常会出现一些意想不到的状况,总结了以下,大部分情况是使用的echo命令导致的。
cat,read等命令读入tab delimited文本,然后用echo输出的时候,文本里面的tab会变成space空格,所以在你尝试以tab为分隔符分割文本的时候要特别注意这种情况。
事实上,echo除了 -n options 之外,常用选项还有:
-e:启用反斜线控制字符的转换
-E:关闭反斜线控制字符的转换(预设如此)
-n:取消行末之换行符号(与 -e 选项下的 \c 字符同意)