使用unix命令从文件中分割特定列的数据

问题描述 投票:0回答:1

我们这里要求根据第3列分割文件

在第三列上,我们有 9 个唯一值,基于此我们需要分成 2 个文件 包含 4 个另一个文件包含剩余 5 个(它基于 3 列中唯一值的数量,如果我们有 20 个唯一值,我们将分成 10 和 10 ) 并且应该在两个文件上添加标题

我们将使用此命令计算唯一值的数量

awk -F'|' '{print $3}' inputfile.txt | uniq

数完如何放入2个文件后 一半的计数应该在一个文件中,剩余在另一个文件中

请为此建议一个脚本/cmd

输入文件

Header|Name|date
 c|125|ER
 de|126|ER
 fr|127|ER
 xe|128|ER
 A|123|MR
 b|124|MR
 c|125|XR
 de|126|YR
 fr|127|ZR
 xe|128|NR
 A|123|BR
 b|124|BR
 c|125|CR
 de|126|CR
 fr|127|DR
 xe|128|DR
 A|123|ER
 b|124|ER

输出文件1

Header |Name | date
 c|125|ER
 de|126|ER
 fr|127|ER
 xe|128|ER
 A|123|ER
 b|124|ER
 A|123|MR
 b|124|MR
 c|125|XR
 de|126|YR
 fr|127|ZR

输出文件2

Header|Name|date
xe|128|NR
 A|123|BR
 b|124|BR
 c|125|CR
 de|126|CR
 fr|127|DR
 xe|128|DR
linux bash shell unix
1个回答
0
投票

我认为在将唯一“值”分派到不同文件之前,您不需要计算它们的数量;当遇到新的“值”时,您可以切换输出文件:

awk -F '|' '
    BEGIN {
        output_files[1] = "outputfile1.txt"
        output_files[2] = "outputfile2.txt"
    }
    NR == 1 {
        for (i in output_files)
            print > output_files[i];
        next
    }
    {
        if ( !($3 in arr) )
            arr[$3] = file_no++ % 2 + 1;
        print > output_files[arr[$3]]
    }
    END {
        for (i in output_files)
            close(output_files[i])
    }
' inputfile.txt

顺便说一句,你的计数方式是错误的;它应该更像是:

awk -F'|' '{print $3}' inputfile.txt | sort -u | wc -l
© www.soinside.com 2019 - 2024. All rights reserved.