LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1123|回复: 10

本人写了一个提取一个文件特定几行的脚本,请大家看看怎么不用下面的方法,用awk语句实

[复制链接]
发表于 2005-8-15 11:30:43 | 显示全部楼层 |阅读模式
#!/bin/sh
#set -x
if [ "$#" -lt 1 ];then
        echo "Usage $0 [file] "
        exit 1
fi
echo  "Enter the line you want to choose from:"
read FromLine
echo  "Enter the line you want to choose to:"
read ToLine

rm -rf temp.txt
Line=`echo "$ToLine-$FromLine" | bc`

#awk '{ x=Line;
#        while(x<Line){
#        printf($x);
#        x-=1;
#        }
#        }' "$1">>temp.txt

x=0
exec < $i        # opens the file you want choose the line from
while read line  # read from the file
do
if [ $x -lt $Line ];then
        printf "%s\n" "$line" >>temp.txt
        x=`expr $x + 1`
else
        echo "DONE"
        exit 1
fi
done

#set +x
发表于 2005-8-15 11:32:26 | 显示全部楼层

  1. awk 'NR>n&&NR<m' file
复制代码

//n:start line,m:end line
回复 支持 反对

使用道具 举报

发表于 2005-8-15 13:30:31 | 显示全部楼层
为啥不用 sed 啊?
回复 支持 反对

使用道具 举报

发表于 2005-8-15 15:09:13 | 显示全部楼层
Post by 寂寞烈火

  1. awk 'NR>n&&NR<m' file
复制代码

//n:start line,m:end line


head -m file | tail +n
回复 支持 反对

使用道具 举报

发表于 2005-8-15 16:27:38 | 显示全部楼层
请问用sed怎么显示文件的最后几行呢?
$只能显示一行,我要显示最后好几行怎么办呢?
回复 支持 反对

使用道具 举报

发表于 2005-8-15 17:38:20 | 显示全部楼层
Post by Safirst
请问用sed怎么显示文件的最后几行呢?
$只能显示一行,我要显示最后好几行怎么办呢?


无论如何,总的行数是必须知道的:

  1. N="$(wc -l "${FILE}" | awk '{ print $1 }')"
  2. sed -n "$(expr "${N}" - "${WANT_LINES}" + 1),$ p" "${FILE}"
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-8-16 01:25:58 | 显示全部楼层
Post by herberteuler
无论如何,总的行数是必须知道的:

  1. N="$(wc -l "${FILE}" | awk '{ print $1 }')"
  2. sed -n "$(expr "${N}" - "${WANT_LINES}" + 1),$ p" "${FILE}"
复制代码


我明白你的意思,但这太复杂啊。
能不能是那种好简单的?
像我开始显得那么天真---------
sed -n "-3,$p" filename,这是虽然是错的,但我希望能接近正确答案。
能再帮忙想想吗?
回复 支持 反对

使用道具 举报

发表于 2005-8-16 09:08:34 | 显示全部楼层
如果只读一遍的话,怎样知道有多少行?又怎样显示“最后几行”?sed 和 awk 这样的过滤程序就是只读一遍的程序。所以,使用它们就只能先计算行数。

如果是使用其他的方式来实现,道理是一样的——只不过计算行数也换成了其他的方式而已。
回复 支持 反对

使用道具 举报

发表于 2005-8-16 18:37:37 | 显示全部楼层
先tac,再用sed取头几行,最后在tac回来
回复 支持 反对

使用道具 举报

发表于 2005-8-16 19:01:13 | 显示全部楼层
Post by 寂寞烈火
先tac,再用sed取头几行,最后在tac回来


看上去这避免了计算总的行数。但实际上,tac 或者是计算了行数,或者用与计算行数相同(甚至更大)的代价完成了它的工作。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表