sh/bash/dash/ksh/zsh等Shell脚本
-
Think1st
- 帖子: 45
- 注册时间: 2012-02-07 23:08
#1
帖子
由 Think1st » 2012-02-20 17:15
如题,有 file1
aaa_2011_09_03.txt
bbb_2011_09_04.txt
ccc_2011_09_05.txt
若用
代码: 全选
more file1 | awk -F"_" '{print $1,$2,$3,$4}'
结果是
aaa 2011 09 03.txt
bbb 2011 09 04.txt
ccc 2011 09 05.txt
而我想要的结果是:
aaa 2011_09_03.txt
bbb 2011_09_04.txt
ccc 2011_09_05.txt
我只想awk每行只做一次分割,该怎么做?

在这里,问题比答案更抢手。
-
josephyoung
- 帖子: 158
- 注册时间: 2011-11-05 18:53
- 来自: 南极圈
#2
帖子
由 josephyoung » 2012-02-20 19:20
你的要求可以这样
代码: 全选
awk 'sub("_"," ")' file1
至于怎么每行一次分割,awk貌似没这样的功能啊
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#3
帖子
由 eexpress » 2012-02-20 19:56
可以打印某行以后的全部。只是分割符号要添加。
sed吧。多用正则。
● 鸣学
-
Think1st
- 帖子: 45
- 注册时间: 2012-02-07 23:08
#5
帖子
由 Think1st » 2012-02-21 10:00
恩,试过
代码: 全选
awk 'sub("_"," ")' file1
和
都可一达到我要的效果。
那也想弄明白awk,是可以限定分割多少次的吗?比如每行只做一次分割,或者只做两次分割,后面的就不做了。
有没有这样的写法?
在这里,问题比答案更抢手。
-
Methuselar
- 帖子: 122
- 注册时间: 2009-06-04 12:06
-
联系:
#6
帖子
由 Methuselar » 2012-02-21 16:25
Think1st 写了:
......
那也想弄明白awk,是可以限定分割多少次的吗?比如每行只做一次分割,或者只做两次分割,后面的就不做了。
有没有这样的写法?
没有。 awk不记录分隔符索引。
也就是说awk无法简单靠分隔符做到
做的事情。
话说你到底要前半部还是后半部? cut是否够用? 数据有其他模式否? 关键看你的数据可以hardcode到什么程度.
代码: 全选
awk -F'[a-z]_' '{print $2}'
Mea Culpa!
-
Think1st
- 帖子: 45
- 注册时间: 2012-02-07 23:08
#7
帖子
由 Think1st » 2012-02-22 9:12
恩,像
cut -d‘_' -f2- file1
应该比较符合我的需要。
我的疑问就是用awk不使用正则式的话,有没有类似cut的"awk -F'_'
-f2- file1" 的这种用法(PS: -f2- 借用cut的表达方式。。)
然后可以得到结果呢?
aaa 2011_09_03.txt
bbb 2011_09_04.txt
ccc 2011_09_05.txt
在这里,问题比答案更抢手。
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#8
帖子
由 eexpress » 2012-02-22 9:34
perl的正则,才是万能的。别纠结一个软件。awk只是处理一种类型的数据方便,并不是通用的软件。
用perlre,你的分割符号可以任意,这任意包括任意的字符串组合。
多学正则。
● 鸣学