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

6712 次点击
所在节点    程序员
86 条回复
liprais
2018-12-05 20:46:02 +08:00
想用 perl 就用 perl 呗
反正之后你会发现三十秒看不懂的东西都得重写
hujianxin
2018-12-05 20:47:24 +08:00
@liprais oneliner 从来都不是为了复用的啊
zbinlin
2018-12-05 20:59:28 +08:00
只用 sed 就可以呀:

sed -r 's/^([[:digit:]]+)([A-Z]+)\s+name=S:([^,]+),.+value=(.+)$/\2\1 \3 \4/'
zbinlin
2018-12-05 21:02:31 +08:00
@zbinlin 呃,没看到第一列的数字反转了
hujianxin
2018-12-05 21:13:14 +08:00
@zbinlin 这个反转,估计用 sed 的保持空间协助一下也能搞定,但是太难了
yiyiwa
2018-12-05 21:14:05 +08:00
这样有点慢啊

awk -F '[: ,]' '{"rev<<<"$1|getline a;print a,$3,$NF}'
yiyiwa
2018-12-05 21:19:10 +08:00
少个+,
awk -F '[: ,]+' '{"rev<<<"$1|getline a;print a,$3,$NF}'
hujianxin
2018-12-05 21:21:20 +08:00
@yiyiwa 这条语句在我这里有语法错误呢

sh: 1: Syntax error: redirection unexpected
name=S value=37461278216723
sh: 1: Syntax error: redirection unexpected
name=S value=21
sh: 1: Syntax error: redirection unexpected
name=S value=1230
sh: 1: Syntax error: redirection unexpected
name=S value=383242544
sh: 1: Syntax error: redirection unexpected
name=S value=11211
sh: 1: Syntax error: redirection unexpected
name=S value=23121
sh: 1: Syntax error: redirection unexpected
name=S value=324342
sh: 1: Syntax error: redirection unexpected
value=43543
sh: 1: Syntax error: redirection unexpected
name=S value=2343235
sh: 1: Syntax error: redirection unexpected
842 value=3434324
sh: 1: Syntax error: redirection unexpected
hujianxin
2018-12-05 21:21:58 +08:00
@yiyiwa 还是同样的错误
yiyiwa
2018-12-05 21:25:53 +08:00
awk -F '[: ,=]+' '{s=length($1);for(i=0;i<s;i++)k=k""substr($1,s-i,1);print k,$4,$NF;k=j}'
rrfeng
2018-12-05 21:27:50 +08:00
翻转第一列:

echo .... | while read a b; do echo $(rev <<< $a) $b;done

如果只有一行的话不需要 while

echo .... | { read a b; echo $(rev <<< $a) $b; }
weyou
2018-12-05 21:29:06 +08:00
首先 awk 是可以用循环来反转的,就是麻烦点。第二,rev 命令很多系统都是自带的吧,为什么不用
rrfeng
2018-12-05 21:31:23 +08:00
@yiyiwa
需要关闭管道,在处理行尾加上 close "rev<<<" 试试
ywgx
2018-12-05 21:34:02 +08:00
对 vimer 来说,也就是录制个宏,播放一下而已
hcymk2
2018-12-05 21:38:08 +08:00
awk 可以自定义函数。
hujianxin
2018-12-05 22:08:41 +08:00
@yiyiwa 这个我也想到啦,但是稍微有点复杂了,长了一些。
@ywgx 感觉分工还不太一样

@hcymk2 自定义函数就不是一行了。。
codechaser
2018-12-05 22:18:46 +08:00
你们说的我根本看不懂……
likuku
2018-12-05 22:26:58 +08:00
额... 我是突然点进了今天的 黑魔法 9 级课程了么?

别说 awk sed 了,shell 开始需要用到 判断 语句 我都果断直接用 py3 了。
zbinlin
2018-12-05 22:35:34 +08:00
@zbinlin

paste -d' ' <(sed -rn 's/^([^ ]+*).+$/\1/p' <filename> | rev) <(sed -rn 's/^.+name=S:([^,]+),.+value=(.+)$/\1 \2/p' <filename>)
ToT
2018-12-05 23:24:40 +08:00
能用 pandas 么。。。。

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

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

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

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

© 2021 V2EX