Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何使用awk对文件重新排序_Shell_Awk - Fatal编程技术网

Shell 如何使用awk对文件重新排序

Shell 如何使用awk对文件重新排序,shell,awk,Shell,Awk,我有一个如下格式的文件 Item-abc,c1,300 Item-abc,c2,500 Item-pqr,c1,900 Item-pqr,c2,800 Item-pqr,c3,600 Item-pqr,c4,700 Item-xyz,c1,950 Item-asd, Item-jkl 我需要按照以下方式重新排列这个文件 Item-abc,c1=300,c2=500 Item-pqr,c1=900,c2=800,c3=600,c4=700 Item-xyz,c1=950 @Jerin,此变体将

我有一个如下格式的文件

Item-abc,c1,300
Item-abc,c2,500
Item-pqr,c1,900
Item-pqr,c2,800
Item-pqr,c3,600
Item-pqr,c4,700
Item-xyz,c1,950
Item-asd,
Item-jkl
我需要按照以下方式重新排列这个文件

Item-abc,c1=300,c2=500
Item-pqr,c1=900,c2=800,c3=600,c4=700
Item-xyz,c1=950

@Jerin,此变体将剥离\r'ss

BEGIN {
FS=","
}

{
    sub(/\x0d/,"",$0)
    split($0,Cols)
    N[Cols[1],Cols[2]]= Cols[3]
}

END {
    for (comb in N) {
       split (comb,S,SUBSEP)
       K[S[1]]=K[S[1]] "," S[2] "=" N[S[1],S[2]]
    }
    for (j in K) if (j != "Name") print j  K[j]
}

@Jerin,此变体将剥离\r'ss

BEGIN {
FS=","
}

{
    sub(/\x0d/,"",$0)
    split($0,Cols)
    N[Cols[1],Cols[2]]= Cols[3]
}

END {
    for (comb in N) {
       split (comb,S,SUBSEP)
       K[S[1]]=K[S[1]] "," S[2] "=" N[S[1],S[2]]
    }
    for (j in K) if (j != "Name") print j  K[j]
}


输入是否已排序?排序不重要。如果输入已排序,则排序当然很重要。如果不是,则更简单的解决方案首先对其进行排序。如果已经排序,则这是浪费的工作。输入没有按任何顺序(asc或desc)排序,但文件中整个记录的第一列值显示为分组在一起。输入是否已排序?排序不重要。如果输入已排序,则排序当然重要。如果不是,则更简单的解决方案首先对其进行排序。如果已经排序,则这是浪费的工作。输入未按任何顺序(asc或desc)排序,但文件中整个记录的第一列值显示在一起。项目abc、C1300项目pqr、C1900项目pqr、C2901项目xyz、C1950显示如下错误(标题行已排除并尝试)项目abc、c1=300、c2=901r、c1=900项目xyz,c1=950我是否正确理解您在输入文件上尝试了上述代码:项目abc、C1300项目pqr、C1900项目pqr、C2901项目xyz、C1950项目pqr,但出现了一些问题
我试了一下,得到了以下结果:
项目abc,c1=300
项目pqr,c1=900,c2=901
项目xyz,c1=950
这是预期的吗?(看起来网站不允许换行:()Jenin,对不起,不要跟着你…。输入和输出不包含标题行…刚试用了Ed的版本,它在我这边也可以正常工作。@EdMorton是的,对不起,对,它假定不排序,而是分组。项目abc,C1300项目pqr,C1900项目pqr,C2901项目xyz,C1950显示如下错误(标题行已排除并尝试)项目abc,c1=300,c2=901r,c1=900项目xyz,c1=950我是否正确理解您在输入文件上尝试了上面的代码:项目abc,C1300项目pqr,C1900
项目pqr,C2901
项目xyz,C1950
并遇到了一些问题?
我在我这方面尝试了一下,得到了以下结果:
项目abc,c1=300
项目pqr,c1=900,c2=901
/>项目xyz,c1=950
是否符合预期?(看起来现场不允许换行:()Jenin,对不起,不要听你的…输入和输出不包含标题行…只是尝试了Ed的版本,它在我这边也可以正常工作。@EdMorton是的,对不起,对,它假设不是排序而是分组。项目abc,C1300项目xyz,C2950项目pqr,C3900项目pqr,C4901显示如下:-项目xyz,c2=950,c4=901r,c3=900我发布的脚本生成了e您从发布的示例输入中发布的预期输出。如果您有一个脚本不适用的案例,请将该案例包含在您的问题中,而不是包含在无法阅读的注释中。我看到您从更新的示例输入中删除了标题行-这当然会破坏一切。请将其添加回去或将
NR>2
更改为
NR>1
在我的解决方案中。我的输入:项目abc,C1300
项目pqr,C1900
项目pqr,C2901
项目xyz,C1950
我的输出:项目abc,c1=300
,c2=901r,c1=900
项目xyz,c1=950
注意:标题行已删除预期输出:项目abc,c1=300
项目pqr,c1=900,c2=901
项目xyz,c1=950创建任意次数。第二列值集对于特定的第一列值都是唯一的。相同的第一列值同时显示项目abc、C1300项目xyz、C2950项目pqr、C3900项目pqr、C4901显示如下:-项目xyz、c2=950、c4=901r、c3=900我发布的脚本根据您发布的示例输入生成您发布的预期输出ed.如果您有一个脚本不适用的案例,那么请将该案例包含在您的问题中,而不是包含在无法阅读的注释中。我看到您从更新的示例输入中删除了标题行-这当然会破坏一切。将其添加回原处或将
NR>2
更改为
NR>1
。我的输入:项目abc,c1,300
项目pqr,C1900
项目pqr,C2901
项目xyz,C1950
我的输出:项目abc,c1=300
,c2=901r,c1=900
项目xyz,c1=950
注:删除标题行预期输出:项目abc,c1=300
项目pqr,c1=900,c2=901
项目xyz,c1=950
第一列值可以重复任意次数。第二列值集对于特定的第一列值将是唯一的。相同的第一列值同时显示
 cat answer.awk
    BEGIN {
    FS=","
    RS="\r\n"  # For Windows"
    }

    {
        N[$1,$2]= $3
    }

    END {
        for (comb in N) {
           split (comb,S,SUBSEP)
           K[S[1]]=K[S[1]] "," S[2] "=" N[S[1],S[2]]
        }
        for (j in K) if (j != "Name") print j  K[j]
    }

    awk -f answer.awk file
    Item-abc,c1=300,c2=500
    Item-pqr,c1=900,c2=800,c3=600
BEGIN {
FS=","
}

{
    sub(/\x0d/,"",$0)
    split($0,Cols)
    N[Cols[1],Cols[2]]= Cols[3]
}

END {
    for (comb in N) {
       split (comb,S,SUBSEP)
       K[S[1]]=K[S[1]] "," S[2] "=" N[S[1],S[2]]
    }
    for (j in K) if (j != "Name") print j  K[j]
}