【问题标题】:Sort field separator problem in external awk call if its semicolon如果分号,则在外部 awk 调用中排序字段分隔符问题
【发布时间】:2019-12-08 00:03:45
【问题描述】:

我有一个 csv 分号分隔,我想对某些字段进行排序,而不需要标题保持标题不变。 如果我使用冒号作为字段分隔符没有问题,但不知道如何使用分号作为字段分隔符。

文件 temp2:

a,b,c,d,e
1,2,3,4,5
3,1,2,3,1
2,3,1,2,3

>cat temp2 | awk 'NR==1; NR > 1 {print $0 | "sort -t, -k2"}'

结果 ok 排序字段 2:

a,b,c,d,e
3,1,2,3,1
1,2,3,4,5
2,3,1,2,3

下一次尝试,做同样的事情,但分号字段分隔符:

文件 temp1

a;b;c;d;e
1;2;3;4;5
3;1;2;3;1
2;3;1;2;3


 >cat temp1 | awk 'NR==1; NR > 1 {print $0 | "sort -t=";" -k2"}'  

使文件保持原样:

a;b;c;d;e
1;2;3;4;5
2;3;1;2;3
3;1;2;3;1  

预期的结果:

a;b;c;d;e
3;1;2;3;1
1;2;3;4;5
2;3;1;2;3

【问题讨论】:

    标签: sorting awk


    【解决方案1】:

    你不需要 awk 来做这个:

    $ head -n 1 file; tail -n +2 file | sort -t';' -k2
    a;b;c;d;e
    3;1;2;3;1
    1;2;3;4;5
    2;3;1;2;3
    

    话虽如此,这在你的 awk 命令中:

    "sort -t=";" -k2"
    

    意思是:

    ("sort -t=") ; (" -k2")
    

    即您的嵌套双引号实际上终止了您要用于在命令中进行排序的字符串。还有一个错误,您使用-t=";" 而不是-t";",所以让我们假设它已修复。现在:

    你可以改用这个:

    "sort -t\";\" -k2"
    

    甚至更好的 wrt shell 引用规则:

    "sort -t\047;\047 -k2"
    

    在下面写下你关于它在 awk 中不起作用的评论,看看:

    $ awk 'NR==1; NR>1{print | "sort -t\047;\047 -k2"}' file
    a;b;c;d;e
    3;1;2;3;1
    1;2;3;4;5
    2;3;1;2;3
    

    【讨论】:

    • 感谢 Ed,这项工作,但想在 awk 上做同样的事情,调用 sort。
    • @User1234141414 我不知道那是什么意思。第一个脚本之后的所有内容都是如何在 awk 中调用 sort ,就像您尝试做的那样,我只是在修复您的语法。我更新了我的答案以显示它在 awk 中工作。
    • 这在 shell 中工作正常,但如果我想对来自脚本中其他管道(或 awk 结果)的数据进行排序,awk 语句中的新管道会产生一些问题,任何人有办法解决这个问题吗? (awk: cmd.line:1: fatal: 无法打开文件 ` ' 进行读取(没有这样的文件或目录))
    • 这与您提出的问题无关(如何在 awk 中使用 ; 进行排序,就像使用 , 一样)。如果您有新问题,请提出新问题。
    • 你说得对 Ed,我会尝试其他方式如果我找不到工作我会提出新的要求,你帮了我很多!
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2014-10-14
    • 2019-12-22
    相关资源
    最近更新 更多