今天有个小需求,用 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

6754 次点击
所在节点    程序员
86 条回复
hujianxin
2018-12-06 10:48:17 +08:00
@bucuoo
qinrui
2018-12-06 10:53:33 +08:00
反转是什么鬼?为什么要反转
zjsxwc
2018-12-06 11:32:50 +08:00
operawang
2018-12-06 11:36:28 +08:00
文本处理当然是 Perl 当家
jjianwen68
2018-12-06 11:40:43 +08:00
写不来这么复杂的 shell
xiaket
2018-12-06 11:46:11 +08:00
```{~}cat a.txt | python3 -c "import sys; \
> seg1 = lambda line: ''.join(reversed(line.split()[0])); \
> seg2 = lambda line: line.split()[1].split(':')[1].rstrip(','); \
> seg3 = lambda line: line.split()[-1].split('=')[-1]; \
> print(''.join(' '.join([seg1(line), seg2(line), seg3(line), '\n']) for line in sys.stdin.readlines()))"```

好吧, 这么纠结的需求要放进一行,Python 的效果也一般.
msg7086
2018-12-06 13:19:08 +08:00
喜欢 Perl 处理文本的可以试试 Ruby ……
buhi
2018-12-06 13:49:24 +08:00
真的是把 shell 这坨狗屎当成宝了...
ecmascript2020
2018-12-06 14:38:18 +08:00
用 javascript
xingheng
2018-12-06 15:47:09 +08:00
@buhi 头一次看到有人讽刺 shell 是一坨屎的
xingheng
2018-12-06 15:56:07 +08:00
用 awk 和 shell 可以实现:

先分片,找到所有期望的元素:
awk -F '[[:space:]]+|:|,|=' '{ print $1" "$4" "$10 }'

然后用 rev 实现反转:
awk '{ system("echo $(echo "$1" | rev) " ); }'

拼起来:
awk -F '[[:space:]]+|:|,|=' '{ system("echo $(echo "$1" | rev) " $4" "$10); }'

看了一下我的环境,rev 是 BSD 的命令,Linux 和 macOS 都内置
no1xsyzy
2018-12-06 15:57:59 +08:00
@xingheng 那么你见得少了,shell 作为编程语言确实是一坨屎
脑子混乱根本不知道自己在干什么的感觉
shell 就只是个壳罢了。
如果不需要调用其他程序我一般还是 python 的。
hujianxin
2018-12-06 16:01:05 +08:00
@no1xsyzy 这个可能是与智商有关系把,我用 shell 很顺手,脑子也很清晰
buhi
2018-12-06 16:01:39 +08:00
shell 从各方面来说作为一个编程语言都是不合格的, 任何正常的编程语言, 包括被人当成梗鄙视的 php, 都能吊打 shell 七条街, 这个就是屎的定义
hujianxin
2018-12-06 16:02:31 +08:00
@xingheng 很赞,学习了
Vegetable
2018-12-06 16:02:32 +08:00
工具是在进步的吧,没必要虐待自己不是?
hujianxin
2018-12-06 16:03:23 +08:00
@buhi 来来,用你先进的工具完成以下题目的问题如何?
hujianxin
2018-12-06 16:05:40 +08:00
@buhi 并没有题目中有提 shell 语言吗?提的时 awk、sed、perl。你是不是想喷人想疯了?搞一个假想敌就开始喷
araraloren
2018-12-06 16:10:48 +08:00
cat **FILE** | perl6 -ne '/ ^ (.*?) \s+ .* \:(\w+) .* "value=" (\d+) $/; say ($0.comb.reverse.join, $1, $2).join("\t")'
你可以一行行的处理,perl 同理。。
MarioLuisGarcia
2018-12-06 16:14:35 +08:00
vim macro

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

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

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

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

© 2021 V2EX