【问题标题】:Splitting files by first char按第一个字符拆分文件
【发布时间】:2020-02-03 10:36:39
【问题描述】:

我需要按行的第一个字符分割一个大文本文件。

例如,我有一个类似的文件:

B1fe3z5 
A1g5sef 
C1gs351qz 
C02qdqz

然后

A1g5sef is copied to a.txt  
B1fe3z5 is copied to b.txt 
C02qdqz and C1gs351qz are copied to c.txt

我试过这个答案:https://stackoverflow.com/a/24778211/9199179

awk '{print > substr($0, 0, 1)}' file

它运行良好,但我有一些以“\”之类的符号开头的行,这些符号在文件名中是被禁止的。

如何将这些行重定向到特定的“symbol.txt”文件?

谢谢!

【问题讨论】:

    标签: shell file unix awk


    【解决方案1】:

    EDIT2 已经在 cmets 部分与 OP 进行过交谈,并且 OP 提到如果 任何一行都从任何字母或数字开始,它应该转到相应的字母,否则它应该转到另一个文件,然后应该尝试跟随。

    awk '{if($0 ~ /^[a-zA-Z0-9]/){file=substr($0, 1, 1)} else {file="symbol_file"};print >> (file);close(file)}' Input_file
    

    OR 根据 Ed sir 的评论,上述解决方案的缩写形式。

    awk '{file = (/^[[:alnum:]]/ ? tolower(substr($0,1,1)) : "symbol") ".txt"; print >> file; close(file)}' Input_file
    


    EDIT1:

    awk '{if($0~/^\\/ || $0~/^\//){file="symbol_file"} else {file=substr($0, 1, 1)};print >> (file);close(file)}' Input_file
    


    请您尝试关注一次。

    awk '{if($0~/^\\/){file=substr($0, 2, 1)} else {file=substr($0, 1, 1)};print >> (file);close(file)}' Input_file
    

    添加了 OP 的方法修复和其他建议:

    1- 你没有关闭后端的输出文件,如果你有巨大的 Input_file 肯定会有问题,最终会出现“打开的文件太多错误”;所以我把它修好了。

    2- 您使用的是substr($0, 0, 1),这不应该是这样;在 substrindex starts from1not from0`.

    3- 对于从\ 开始的行的问题,我已经检查了它的条件,如果行以\ 开头,则为输出文件取第二个字符或为输出文件名取第一个字符。

    【讨论】:

    • 你是最棒的。你的时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2021-06-25
    • 2012-05-21
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多