V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dragonszy
V2EX  ›  问与答

请教文本文件批量处理问题

  •  
  •   dragonszy · 2014-09-05 19:56:22 +08:00 · 2657 次点击
    这是一个创建于 3736 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有三十几个文本文件,每个一千多行,有用内容是两个区块,每个区块是三列数字。

    1.删除 1-21行
    2.保留 22-822行 (记为A区块,3列数字,由tab分割)
    3.删除 823-828行
    4.保留 829-1629行 (记为B区块,3列数字,由tab分割)
    5.将 B区块的第2列 替换掉 A区块的第3列,然后删除B区块

    其实就是选取A区块的1、2列和B区块的第2列合并为一个新区块,导出文本文件。

    原来只有一两个文本文件的时候都是用 sublime text 手动处理的,现在文件比较多,也不会 awk,sed 什么的,故求万能的v2exer们给个脚本!谢谢!
    3 条回复    2014-09-07 13:09:26 +08:00
    merlin852
        1
    merlin852  
       2014-09-05 21:00:53 +08:00 via iPad
    awk'NR>=22&NR<=822{a[NR]=$1,c[NR]=$3}NR>=829&NR<=1629{b[NR-807]=$2}END{for(i in a)print a[i],b[i],c[i]} file >>newfile
    dragonszy
        2
    dragonszy  
    OP
       2014-09-05 21:44:37 +08:00
    @merlin852 谢谢啦!不过我修改后运行了一下还是有语法错误。应该是在a[NR]=$1这块儿,直接用行号好像不能内部循环。我看了 http://coolshell.cn/articles/9070.html 发现没有[NR]的例子,不知怎么才能赋值。求解!

    awk 'NR>=22 && NR<=822 {a[NR]=$1,b[NR]=$2} NR>=829 && NR<=1629 {c[NR-828]=$2} END {for(i in a) printf "%s\t%s\t%s",a[i],b[i],c[i]}' file.txt >> newfile.txt
    merlin852
        3
    merlin852  
       2014-09-07 13:09:26 +08:00 via iPad
    &是两,$1后面,换;应该就好了,没开电脑没法测试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3261 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:21 · PVG 20:21 · LAX 04:21 · JFK 07:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.