[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

gawk如何按字符长度进行截取

本帖最后由 pcl_test 于 2018-6-10 13:20 编辑

gawk如何按字节长度进行截取
如下数据
26330398    哈萨克斯坦国         16
34790104    UNITED AMARA              16

通过gawk进行截取标红的部分,第一行可以使用 gawk函数 substr($0,12,6)就可以截取,但是第二行就只能substr($0,12,12)
如何通过字节进行截取?

求助啊。。。大神们快帮帮忙啊!

TOP

多发点数据看看?就是为了截取中间部分?肯定有其它的办法的

TOP

回复 3# cfwyy77_bat


    [attach]11261[/attach]

    数据见附件

TOP

我暂想到的是 先把中间段grep出来,再sed去多余的空格。文本要改成utf-8编码。
  1. grep -Po '(?<=\d{8}\s{4}).+(?=\d{2} [a-zA-Z]{3,})' data.txt | sed 's/\s*$//g'
复制代码
结果:
  1. 香港上海汇丰银行有限公司
  2. 山东省农村信用社联合社
  3. 宁波鄞州农村商业银行
  4. 辉县珠江村镇银行
  5. 延吉和润村镇银行
  6. 哈萨克斯坦国民储蓄银行
  7. 哈萨克斯坦国民储蓄银行
  8. 哈萨克斯坦国民储蓄银行
  9. 哈萨克斯坦国民储蓄银行
  10. UNITED AMARA BANK
  11. Dubai lslamic Bank Pakistan
  12. Dubai lslamic Bank Pakistan
  13. Bank of Tajikistan Amonatbank
  14. 河北省农村信用社联合社
  15. 山东农村信用联合社
  16. 北京顺义银座村镇银行
  17. 江西赣州银座村镇银行
  18. 深圳福田银座村镇银行
  19. 重庆渝北银座村镇银行
  20. 重庆黔江银座村镇银行
复制代码

TOP

回复 5# cfwyy77_bat


    grep -Po "(?<=\d{8}\s{4}).+(?=\d{2} [a-zA-Z]{3,})" "f:\bbb.txt"

    我是在win10下,用的是win环境下的grep.exe,这样没有任何打印输出啊?

TOP

回复 6# shootman2

我是在bash环境下试的 grep 版本是3.0.
你grep  哪个版本?没有结果 也没有出错信息吗?

TOP

回复 7# cfwyy77_bat


    [attach]11263[/attach]

TOP

  1. grep -Po "(?<=\d{8}\s{4}).*[^\s](?=\s{1,}\d{2})" a.txt > b.txt
复制代码
我的测试环境里面执行成功:
Win7
grep (GNU grep) 3.0
顶楼数据
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 8# shootman2
win下我也不太搞的懂 。我这在win下试 也有报错。我感觉可能还是和文本编码有关系。
我现在像这种命令行工具 grep,gawk,sed 我是喜欢在 bash下用了,感觉windows 命令行对utf8的支持不太好,经常有乱码还有其它问题。
要么直接linux的bash,要么win10下的  bash on Ubuntu,  要么 Git Bash.

TOP

回复 10# cfwyy77_bat


    这已经足够了!非常感谢你的支持!

TOP

回复 11# shootman2


    9楼那种写法能成功吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 12# Batcher


    能行!但是还好像还是没有解决我的问题!

TOP

回复 13# shootman2

具体哪里没解决?
我用9楼的代码和4楼的数据测试得到的结果是:

香港上海汇丰银行有限公司
山东省农村信用社联合社
宁波鄞州农村商业银行
辉县珠江村镇银行
延吉和润村镇银行
哈萨克斯坦国民储蓄银行
哈萨克斯坦国民储蓄银行
哈萨克斯坦国民储蓄银行
哈萨克斯坦国民储蓄银行
UNITED AMARA BANK
Dubai lslamic Bank Pakistan
Dubai lslamic Bank Pakistan
Bank of Tajikistan Amonatbank
河北省农村信用社联合社
山东农村信用联合社
北京顺义银座村镇银行
江西赣州银座村镇银行
深圳福田银座村镇银行
重庆渝北银座村镇银行
重庆黔江银座村镇银行
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 14# Batcher


    [attach]11274[/attach]

    大神!你好,原数据见附件。。。
   
    数据中一共是7个字段的数据,由于没有分割符,但又不能使用空格做分隔符,因为第二个字段中含有空格,
    所以,问题就是如何才能正确的区分这些字段。如果能够区分开,最好能将字符数据末尾的空格去掉。最终变成如下的数据。
  1. 26330398|哈萨克斯坦国民储蓄银行|16|50|1|2|A
  2. 26330398|哈萨克斯坦国民储蓄银行|16|51|1|2|A
  3. 26330398|哈萨克斯坦国民储蓄银行|16|52|1|2|A
  4. 26330398|哈萨克斯坦国民储蓄银行|16|53|1|2|A
  5. 34790104|UNITED AMARA BANK|16|400|1|1|A
  6. 36100586|Dubai lslamic Bank Pakistan|16|700|1|1|A
  7. 36100586|Dubai lslamic Bank Pakistan|16|701|1|1|A
  8. 36350762|Bank of Tajikistan Amonatbank|16|800|1|2|A
  9. 69410000|河北省农村信用社联合社|16|812|1|2|A
  10. 14144500|山东农村信用联合社|16|9|1|1|U
  11. 15201000|北京顺义银座村镇银行|16|7002|1|1|U
  12. 15204280|江西赣州银座村镇银行|16|7003|1|1|U
  13. 15205840|深圳福田银座村镇银行|16|7001|1|1|U
  14. 15206900|重庆渝北银座村镇银行|16|7006|1|1|U
  15. 15206925|重庆黔江银座村镇银行|16|7007|1|1|U
复制代码

TOP

返回列表