【问题标题】:awk or sed to create new file?awk 或 sed 创建新文件?
【发布时间】:2013-02-07 03:49:18
【问题描述】:

我有一个以竖线分隔的文本文件,其中包含大约 900 行数据。每行包含一组数字,最后有一个用户名。例如

2792|5750|125|4.0|0.25|||6|2|user1
2802|6000|126|4.0|0.25|||2|3|user2
2801|6000|125|4.0|0.25|||4|4|user2
2805|5500|125|4.5|0.25|||3|2|user1
2805|6250|122|4.5|0.25|||4|7|user3
2811|4750|125|3.0|0.25|||4|2|user1
2828|5750|121|4.0|0.25|||6|2|user2

我想做的是创建三个新文件:每个用户一个,只包含他们的数据。 (例如,user1 的文件将只包含原始文件的第一行、第四行和第六行)。我应该使用 awk 还是 sed 来执行此操作?

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    一种方式:

    awk -F "|" '{ print > $NF }' file
    

    这是grep . user*的结果:

    user1:2792|5750|125|4.0|0.25|||6|2|user1
    user1:2805|5500|125|4.5|0.25|||3|2|user1
    user1:2811|4750|125|3.0|0.25|||4|2|user1
    user2:2802|6000|126|4.0|0.25|||2|3|user2
    user2:2801|6000|125|4.0|0.25|||4|4|user2
    user2:2828|5750|121|4.0|0.25|||6|2|user2
    user3:2805|6250|122|4.5|0.25|||4|7|user3
    

    另外,有些人喜欢添加文件扩展名。这可以像这样完成:

    awk -F "|" '{ print > $NF ".txt" }' file
    

    【讨论】:

    • 我的 awk 有点生锈了,你要>>吗?否则非常好。
    • 这实际上是一个常见的误解。 awk 保持其文件句柄打开,直到完成。但它真的可以写成任何一种方式。
    • @MeganCrane:如果它对您有用,请不要忘记接受答案。干杯。
    • @steve,我试过我收到此错误' (Protocol error)p.txt FNR=1) fatal: can't redirect to user1
    • @user19340357:TBH,我不能 100% 确定是什么让你感到悲伤。但是,如果您使用的是BSD awk,您可能需要先创建一个变量。试试:awk -F "|" '{ x = $NF ".txt"; print > x }' file。 HTH。
    【解决方案2】:

    为什么不grep

    grep user1 bigfile > file_for_user1
    grep user2 bigfile > file_for_user2
    grep user3 bigfile > file_for_user3
    

    【讨论】:

      【解决方案3】:
      for THEUSER in `cat file | awk -F'|' '{print $10}' | sort | uniq`; do grep $THEUSER file > $THEUSER; done
      

      【讨论】:

      • 你可能想稍微解释一下你在这里做什么,所以它比解决这个特定问题更广泛适用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 2017-04-23
      • 2015-03-19
      • 1970-01-01
      • 2014-12-10
      相关资源
      最近更新 更多