linux - 从文本文件中分割记录 block

标签 linux file text awk split

大家好,我有制表符分隔的文件,如下所示

输入文件

6      12312321     123213 123321       
8      afddsf      askakf  asfds          
4      fsdaofs     safjsdf kasdbfksdj        
4      safndsj     skfkds  sfsjl           
4      skjfs       akjsfk  kjdsafk        
9      asnfkjds    kjsdksd ksafnd           
7      12321321    124124 124124         
6      78787878    984929  29232       
8      afddsf      askakf  asfds           
4      fsdaofs     safjsdf kasdbfksdj        
4      safndsj     skfkds  sfsjl          
4      skjfs       akjsfk  kjdsafk          
9      asnfkjds    kjsdksd ksafn           
7      78787878    233232  242214

预期输出 1:file1.txt - 根据第一列中的 6 和 7 值分割第一组

6      12312321     123213 123321       
8      afddsf      askakf  asfds          
4      fsdaofs     safjsdf kasdbfksdj        
4      safndsj     skfkds  sfsjl           
4      skjfs       akjsfk  kjdsafk        
9      asnfkjds    kjsdksd ksafnd           
7      12321321    124124 124124  

预期输出 2:file2.txt

6      78787878    984929  29232       
8      afddsf      askakf  asfds           
4      fsdaofs     safjsdf kasdbfksdj        
4      safndsj     skfkds  sfsjl          
4      skjfs       akjsfk  kjdsafk          
9      asnfkjds    kjsdksd ksafn           
7      78787878    233232  242214

预期输出 3:file3.txt - 根据第一列中的 8 和 9 值进行分割

8      afddsf      askakf  asfds          
4      fsdaofs     safjsdf kasdbfksdj        
4      safndsj     skfkds  sfsjl           
4      skjfs       akjsfk  kjdsafk        
9      asnfkjds    kjsdksd ksafnd  

预期输出 4:file4.txt

8      afddsf      askakf  asfds           
4      fsdaofs     safjsdf kasdbfksdj        
4      safndsj     skfkds  sfsjl          
4      skjfs       akjsfk  kjdsafk          
9      asnfkjds    kjsdksd ksafn 

最佳答案

这个问题很复杂,因为在处理完整个文件之前,我们不知道如何创建具有正确索引的文件名。

#! /usr/bin/awk -f

BEGIN {
    FS = "\t"
    split("", b67)
    split("", b89)
    i67 = i89 = 0
}

 (i67 in b67)            { b67[i67] = b67[i67] ORS $0 }
 (i67 in b67) && $1 == 7 { ++i67 }
!(i67 in b67) && $1 == 6 { b67[i67] = $0 }

 (i89 in b89)            { b89[i89] = b89[i89] ORS $0 }
 (i89 in b89) && $1 == 9 { ++i89 }
!(i89 in b89) && $1 == 8 { b89[i89] = $0 }

END {
    f = 0
    for (i = 0; i < i67; ++i)
        print b67[i] > "file" ++f ".txt"
    for (i = 0; i < i89; ++i)
        print b89[i] > "file" ++f ".txt"
}

in 模式周围有一些 (),这些并不是必需的,但放置它们是为了增加清晰度。

关于linux - 从文本文件中分割记录 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49662739/

相关文章:

C-opendir + fopen

c# - C#比较两个文件

mysql - 在mysql中将文本转换为blob

python - 我如何在 PYTHON 中遍历文件中的单词?

linux - 如何开始使用 fbx-conv? "Command not found"问题

python - 64 位处理器与 32 位操作系统程序兼容性?

linux - 在 linux 中使用 sed 替换字符串后面的数字时得到一个额外的数字

Java servlet 上传新文件到服务器

java - 解析多种文件类型的文本

linux - 创建一个平面 tar 文件,将每个文件名保存在以 "a"开头的目录中