免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6621 | 回复: 13

[快解决了] awk 连续域的显示及单字符判断的问题 [复制链接]

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-06-20 19:33 |显示全部楼层
本帖最后由 惟吾无为 于 2011-06-23 09:47 编辑

假设需要处理倒数第2个域, 怎样表示?
这个是为了判断倒数第2域是否为r, 如果是就替换成x.
我故意把数据写开些. 理想中的第1域或第2域可能有不定的空格, 但最后3域格式固定. 所以...
d         d      n   r   3
a s d    df f   t   r   2


第3至第9域(不一定是最后一个域)呢?
主要是为了处理ll的结果, 含有空格的文件名就不好办了.
ll "a b c"
-rw-r--r-- 1 root root 677888 Apr  5 22:12 a b c
若是链接, 就又不好办了
ll "c f G"
lrw-r--r-- 1 root root 677888 Apr  5 22:12 c f G -> a b c



顺便问下, 中文文件名截取的问题.
只显示前N或N-1(防止半个中文)个字节. locale无效, 编码gbk, 所以只得自行截取判断.
直接printf截会有半个中文. 自己的纯bash实现感觉有点慢.
希望实现awk依次按字节截取字串, 并判断截获的那1Byte是否属于ascii字符的方法.(不介意有更好的方案)

论坛徽章:
0
发表于 2011-06-20 19:56 |显示全部楼层
这个比较有趣,求解!

论坛徽章:
0
发表于 2011-06-20 20:55 |显示全部楼层
本帖最后由 南极雨 于 2011-06-20 21:11 编辑

回复 1# 惟吾无为


    倒数第二个域:[root@localhost ~]# echo 'd         d      n   r   3
> a s d    df f   t   r   2' | awk '{print $(NF-1)}'
r
r

至于第三域到第九域和中文字符我就没什么好办法了...
第三域到第九域可以在第二个域那里用sed 加入个回车,然后再取偶数行即可!

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-06-20 21:58 |显示全部楼层
$(NF-1) 原来可以这样. 那些awk教程都没写...

论坛徽章:
0
发表于 2011-06-22 09:30 |显示全部楼层
说说实际需求,也许会得到更好的解答

在正确的locale下,awk是可以截取指定长度的中文字符的

  1. ls | (LANG=GBK awk '{print substr($0,1,5);}' 会显示每个文件名的前5个字符
  2. ls | (LANG=POSIX awk '{print substr($0,1,5);}' 会显示每个文件名的前5个字节
复制代码

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-06-22 11:54 |显示全部楼层
本帖最后由 惟吾无为 于 2011-06-22 11:56 编辑
说说实际需求,也许会得到更好的解答

在正确的locale下,awk是可以截取指定长度的中文字符的
springwind426 发表于 2011-06-22 09:30



    locale无效. 二者结果相同.

我想知道怎样在awk里实现
char=${string:start_position:charlength}   # 截取并赋值

if [[ "$char" == [^[:ascii:]] ]] ...   # 判断刚才截取的内容是否为ascii字符.

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-06-22 12:00 |显示全部楼层
回复 6# 惟吾无为


    substr + 正则匹配 试试

论坛徽章:
1
巳蛇
日期:2013-10-28 15:55:33
发表于 2011-06-22 17:32 |显示全部楼层
不会awk, 所以才发问的...

还有awk数组, 能不能直接表示所有内容. 像${arry[*]}. 而非for逐个显示内容.

论坛徽章:
0
发表于 2011-06-22 22:11 |显示全部楼层
[root@jssweb awk]# awk '{print $(NF-1)}' 123 | awk '{a=$1;(a!~/1/) ? $1 : x ; print $1}'
1
3
4
4
4
r

思路有了 语法记不清了 擦

论坛徽章:
0
发表于 2011-06-22 22:22 |显示全部楼层
[root@jssweb awk]# cat 123
Mary 12 1  33
mary 23 3  343
Maty 24 4  33
lucy 25 4  33
lily 25 4  33
lily 25 r  33


[root@jssweb awk]# awk '{print $(NF-1)}' 123 | awk '{a=($1!~/r/) ? $1 : "x" ; print a}'
1
3
4
4
4
x
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP