伙计们,我遇到了问题。
我有样本数据
2021-04-15 07:47:34 629 deveon3/10d/023aad3eab0a035aef3771c9220940e200a00000000242e5_0.gt
我只需要
023aad3eab0a035aef3771c9220940e200a00000000242e5
我尝试
grep _0.gt test.txt | sed "s/.* \(.*\) \(...\)\/\(.*\)_0.gt/\1|\2|\3/g" > test.dat
但我得到相同的输出,没有区别
我期待的是如果我有
2018-10-20 19:34:23 1668004 000/02001386c62785e42231c679c614228a04000090022ff989_0.gt
2018-10-20 21:18:58 1694936 000/02001386c62785e72231c679c614228a040000000232d761_0.gt
2018-10-20 23:59:40 1828575 000/020057386c6278e72231c679c644228a04000000023696fb_0.gt
获取输出
1668004|000|02001386c62785e72231c679c614228a04000000015528dd
1694936|000|02001386c62785e72231c679c614228a040000000166bca7
1828575|000|02001386c62785e72231c679c614228a04000000022f8f33
要不就
02001386c62785e72231c679c614228a04000000015528dd
02001386c62785e72231c679c614228a040000000166bca7
02001386c62785e72231c679c614228a04000000022f8f33
我究竟做错了什么?
答案1
awk -F'[_/ ]+' '{ print $5 }' infile
awk -F'[_/ ]+' -v OFS="|" '{ print $3, $4, $5 }' infile
答案2
假设您想要每行第四个空格分隔字段中的最后一个/
和第四个之间的数据:_
$ awk '{ sub(".*/","",$4); sub("_.*","",$4); print $4 }' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb
这使用sub()
两次来修剪第四个字段中最后一个/
字段之前和之后出现的任何内容_
。然后它打印该字段的剩余内容。
使用sed
替代,并假设没有其他/
字符后我们感兴趣的数据:
$ sed 's|.*/||; s/_.*//' file
02001386c62785e42231c679c614228a04000090022ff989
02001386c62785e72231c679c614228a040000000232d761
020057386c6278e72231c679c644228a04000000023696fb
如果您想从第三个字段获取更多信息,并且想要将分隔符更改为|
,您可以awk
像这样使用:
$ awk -v OFS='|' '{ gsub("/",OFS,$4); sub("_.*","",$4); print $3,$4 }' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
首先将/
第四个字段中的所有内容更改为任何OFS
内容(它是输出字段分隔符,我们|
在命令行上将其设置为)。然后我们像以前一样修剪掉后面的任何内容_
并打印第三个和修改后的第四个字段。
有了sed
,这是可行的,尽管有点尴尬:
$ sed 's/\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{2\}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
或使用非标准-E
选项来使用扩展正则表达式:
$ sed -E 's/([^[:blank:]]+[[:blank:]]+){2}//; s/_.*//; y/\/ /||/' file
1668004|000|02001386c62785e42231c679c614228a04000090022ff989
1694936|000|02001386c62785e72231c679c614228a040000000232d761
1828575|000|020057386c6278e72231c679c644228a04000000023696fb
这首先删除前两个字段及其后面的空格,然后删除_
.最后,它将所有空格 和 更改/
为|
。