今天有个小需求,用 awk 和 sed 貌似不能很好的完成任务,打算转战 perl 了

2018-12-05 20:38:20 +08:00
 hujianxin

有一个文件,a.txt ,文容如下:

0689LM  name=S:321, password=154adfv839473, value=37461278216723
1633LM  name=S:241, password=15sdf78839611, value=21
1121LM  name=S:673, password=1543978839612, value=1230
1212LM  name=S:854, password=fd43978df9621, value=383242544
3323LM  name=S:456, password=sd9788396sdd3, value=11211
3322LM  name=S:234, password=dsfas78839623, value=23121
4238LM  name=S:254, password=1fdsafdsafdsa, value=324342
51LM    name=S:903, password=fdsafsdafsdaf, value=43543
2389LM  name=S:572, password=fdsfdsdfwefff, value=2343235
91452LM name=S:842, password=sdfwef23dffds, value=3434324
9553LM  name=S:fed, password=23fdssfdss32f, value=10501342176

需求:输出第一列的反转,name=S:之后的数字,value 之后的数值,如下:

ML9860 321 37461278216723
ML3361 241 21
ML1211 673 1230
ML2121 854 383242544
ML3233 456 11211
ML2233 234 23121
ML8324 254 324342
ML15 903 43543
ML9832 572 2343235
ML25419 842 3434324
ML3559 fed 10501342176

awk,不好实现第一列的反转

sed,不好显示抓取 name=S:之后的数字(需要非贪婪)

当然,也可能是我才疏学浅,如果各位大佬有更好的解决方法,欢迎指教。

perl -aE '/name=S:(.*?),.*?value=(.*)/; $a = reverse $F[0]; say "$a $1 $2"' a.txt

6753 次点击
所在节点    程序员
86 条回复
xpresslink
2018-12-05 23:37:00 +08:00
随便用个编程语言打开文件逐行遍历一下就可以。
DAPTX4869
2018-12-05 23:59:05 +08:00
shell 这堆玩意....瞎了
realpg
2018-12-06 00:33:23 +08:00
python 不好么
其实更好的解决方案是 EXCEL
livepps
2018-12-06 00:47:41 +08:00
python 分分钟的事情
agagega
2018-12-06 01:03:06 +08:00
我想了想用 Ruby,也可以一行搞定,结果可能可读性比你的 Perl 稍微高点点,也没差太多...
yue9944882
2018-12-06 01:05:37 +08:00
写 perl 很多年了。。perl 现在实战的价值就是所谓 one-liner。。谁写的更精简谁就更好,不管可读性。。这也是 perl 同 python 等其他“更高级”的语言的一个优势吧。。有点像所谓降维打击哈哈哈

(不要学 perl 了,浪费时间)
congeec
2018-12-06 01:15:00 +08:00
#23 说的对
我都复制下来,放 excel 里
写正则还要查一会儿语法
Tony042
2018-12-06 02:41:48 +08:00
@congeec 放 excel 里怎么实现呢,能大概讲讲吗
thedrwu
2018-12-06 03:00:14 +08:00
perl 作为主力脚本语言十多年,自从因为 numpy 用了 Python,发现回不去 perl 了:
连 foreach 都不会写了,
哪些操作会影响$_也忘了。
嗯?这里的引用要套几层?
从前的我怎么到处都在用 qw,那是干啥的现在怎么想不起来了…
重新学 perl 好麻烦,还是退回 bash+sed+awk 算了。
congeec
2018-12-06 03:04:48 +08:00
@Tony042 假设你用 mac, 用 pbcopy/pbpaste 来复制粘贴。windows 也有类似的工具,不过你要自己找
tips:column 是个很好用的表格格式化命令
zxcvsh
2018-12-06 07:55:14 +08:00
@ToT 你怎么会想到用 pandas 的
Mithrandir
2018-12-06 09:07:54 +08:00
为啥不用 python,或者 awk + sed + python -c
swordne
2018-12-06 09:40:11 +08:00
为啥我觉得这东西在 excel 里就能完成了?
bellucci1964
2018-12-06 09:56:48 +08:00
说 python 就算了,说 excel 的又是什么鬼,ssh 到远程主机上哪来的 excel
julypanda
2018-12-06 10:01:26 +08:00
不会发图,手动表情
“这就是强者的世界吗?”
hujianxin
2018-12-06 10:15:32 +08:00
不会发图,手动表情
“ talk is cheap, show me your code or excel picture ”
thecon
2018-12-06 10:38:52 +08:00
正解,oneliner 目前还没有什么能比 perl 更趁手的吧
bucuoo
2018-12-06 10:40:33 +08:00
awk 版本
awk '{gsub(/[[:digit:]]+/,"&=",$1); split($1,aa,"="); split($2,na,"[=:,]"); split($4,va,"="); print aa[2]aa[1]" "na[3]" "va[2]}' a.txt
hujianxin
2018-12-06 10:42:15 +08:00
@thedrwu 老哥,都用了 9 年了,这么快就忘了啊
hujianxin
2018-12-06 10:46:57 +08:00
@thecon
简单的任务,awk 更简洁,输入的字符更少,比如我需要看 nginx 日志里面的服务器错误的 log,只需要:awk '$4>=500'。
但是复杂点的任务,比如我题目中提到的,perl 又更简洁很多,毕竟提供了功能强大的函数。
如果再复杂的任务,谁还用 oneliner 啊,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/514702

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX