Chinaunix

标题: awk怎么输出除$1外的$2...$n的所有元素 [打印本页]

作者: hansfly    时间: 2007-08-28 11:07
标题: awk怎么输出除$1外的$2...$n的所有元素
对于下面的代码,怎么采用awk去掉前面的行号?用cut可以解决,想知道用awk怎么处理
   1 #!/bin/bash
   2 # self-destruct.sh
   3
   4 kill $$  # Script kills its own process here.
   5          # Recall that "$$" is the script's PID.
   6
   7 echo "This line will not echo."
   8 # Instead, the shell sends a "Terminated" message to stdout.
   9
  10 exit 0
  11
  12 #  After this script terminates prematurely,
  13 #+ what exit status does it return?
  14 #
  15 # sh self-destruct.sh
  16 # echo $?
  17 # 143
  18 #
  19 # 143 = 128 + 15
  20 #             TERM signal

作者: 寂寞烈火    时间: 2007-08-28 11:14
sed 's/^ \+[0-9]\+ //'
作者: waker    时间: 2007-08-28 11:15
如果不介意前导空格可以直接 $1=""
如果介意
试试sub()?
作者: hansfly    时间: 2007-08-28 11:51
标题: 回复 #2 寂寞烈火 的帖子
这样好像不想,行号前面有空格的,不能匹配模式^\+[0-9]\+
作者: madoldman    时间: 2007-08-28 12:03
人家的是
“^ \+[0-9]\+ ”而不是你的
“^\+[0-9]\+”
作者: 寂寞烈火    时间: 2007-08-28 12:26
版主的方法简单, 或者
awk '{for(i=2;i<=NF;i++)}
作者: hansfly    时间: 2007-08-28 12:59
明白了,没看清~谢谢各位
作者: hansfly    时间: 2007-08-28 14:51
自己总结了下,按照上面的办法:
cut -c6- sample
awk '{ $1=""; print}' sample | sed 's/^ \+//' (不知道怎么用sub,只好用sed去掉前面的空格了)
sed 's/^ \+[0-9]\+ *//' sample (烈火大大的模式最后有个空格会有点问题,对于空白行不能去掉前面的行号)
awk ‘{ for(i=2; i<=NF; ++i) printf("%s ", $i); print "" }' sample

学习中,以后请高手们多多指导~~3x

[ 本帖最后由 hansfly 于 2007-8-28 16:16 编辑 ]
作者: 寂寞烈火    时间: 2007-08-28 15:03
awk的sub
awk '{sub(/.*/,"",$1);sub(/^ /,"");print}'
如果文件行数成百上千行的话, 你的cut就不成啦
作者: ivhb    时间: 2007-08-28 15:23
awk下,是否可以
awk -F "^[ ]*[0-9]+[ ]+" '{print (NF == 2) ? $2 : $0}'  ur-file
写的晦涩一点,但是更加简洁就是
awk -F "^[ ]*[0-9]+[ ]+" '{print $(1+(NF==2))}'
作者: hansfly    时间: 2007-08-28 16:01
原帖由 寂寞烈火 于 2007-8-28 15:03 发表
awk的sub
awk '{sub(/.*/,"",$1);sub(/^ /,"");print}'
如果文件行数成百上千行的话, 你的cut就不成啦

呵呵 学习ing~
sub(r,s,t)       
Substitutes s for first match of the regular expression r in the string t. Returns 1 if successful; 0 otherwise. If t is not supplied, defaults to $0.
作者: hansfly    时间: 2007-08-28 16:23
原帖由 ivhb 于 2007-8-28 15:23 发表
awk下,是否可以
awk -F "^[ ]*[0-9]+[ ]+" '{print (NF == 2) ? $2 : $0}'  ur-file
写的晦涩一点,但是更加简洁就是
awk -F "^[ ]*[0-9]+[ ]+" '{print $(1+(NF==2))}'

不能匹配空白行,将后面的空格跟着的+改成*可以
awk -F "^[ ]*[0-9]+[ ]*" '{print (NF == 2) ? $2 : $0}'  ur-file




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2