【问题标题】:Splitting file based on first column's first character and length根据第一列的第一个字符和长度拆分文件
【发布时间】:2021-06-25 06:01:27
【问题描述】:

我想将.txt 分成两部分,其中一个文件包含所有行,其中第一列的第一个字符为“A”且第一列中的字符总数为 6,而另一个文件包含所有其余部分.搜索让我找到了awk 命令以及根据第一个字符分隔文件的方法,但我找不到任何根据列长度分隔文件的方法。

我不熟悉awk,所以我尝试(无济于事)是awk -F '|' '$1 == "A*****" {print > ("BeginsWithA.txt"); next} {print > ("Rest.txt")}' FileToSplit.txt

非常感谢任何帮助或指向正确方向的指针。

编辑:正如 RavinderSingh13 提醒的那样,我最好放一些输入和预期输出的样本/示例。

所以,这是一个输入示例:

#FileToSplit.txt#
2134|Line 1|Stuff 1
31516784|Line 2|Stuff 2
A35646|Line 3|Stuff 3
641|Line 4|Stuff 4
A48029|Line 5|Stuff 5
A32100|Line 6|Stuff 6
413|Line 7|Stuff 7

预期的输出是什么:

#BeginsWith6.txt#
A35646|Line 3|Stuff 3
A48029|Line 5|Stuff 5
A32100|Line 6|Stuff 6

#Rest.txt#
2134|Line 1|Stuff 1
31516784|Line 2|Stuff 2
641|Line 4|Stuff 4
413|Line 7|Stuff 7

【问题讨论】:

  • 您能否在您的问题中发布输入和预期输出示例,干杯。
  • 您的文件管道是否有分隔符?

标签: linux awk split


【解决方案1】:

您想要做的是使用正则表达式和长度函数。您没有显示您的输入,所以我将留给您设置字段分隔符。根据您的描述,您可以这样做:

awk '/^A/ && length($1) == 6 { print > "file_a.txt"; next } { print > "file_b.txt" }' file

这将获取file中的信息,如果第一个字段以"A"开头并且长度为6字符,则记录写入file_a.txt,否则记录写入file_b.txt(根据需要调整名称)

【讨论】:

  • 不客气。注意@anubhava 和@ravinderSingh13 的其他答案——他们也会有好的方法。 (总是不止一种方法来给猫剥皮:) 例如,您也可以将单个测试用作awk '$1 ~ /^A.....$/ {...。但是您想这样做。
【解决方案2】:

非正则表达式awk 解决方案:

awk -F'|' '{print $0>(index($1,"A")==1 && length($1)==6 ? "file_a.txt" : "file_b.txt")}' file

【讨论】:

    【解决方案3】:

    对于您显示的示例,您能否尝试以下操作。由于您显示的示例不是从A 开始的,所以我没有在此处添加该逻辑,因此此解决方案还确保第一个字段的长度为所有 6 位数字。

    awk -F'|' '$1~/^[0-9]+$/ && length($1)==6{print > ("BeginsWith6.txt");next} {print > ("rest.txt")}' Input_file
    

    第二个解决方案:如果您的第一个字段从 A 开始,后面是 5 位数字(您声明但在显示的示例中没有),请尝试以下操作。

    awk -F'|' '$1~/^A[0-9]+$/ && length($1)==6{print > ("BeginsWith6.txt");next} {print > ("rest.txt")}'  Input_file
    

    OR(上述更好的版本):

    awk -F'|' '$1~/^A[0-9]{5}$/{print > ("BeginsWith6.txt");next} {print > ("rest.txt")}' Input_file
    

    【讨论】:

    • 是的,我写错了我的例子,有点困惑。谢谢你提醒我,现在修好了。
    • @LeoS.,不是问题,我们都在这里互相学习 :) 我现在已经更新了我的第二个解决方案,干杯和快乐的学习。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2020-02-03
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多