【问题标题】:Delete duplicate headers in awk删除 awk 中的重复标题
【发布时间】:2014-11-10 05:12:19
【问题描述】:

我使用cat 来组合多个文件,它们都具有相同的标题。无论如何我可以保留 1st 出现的标头并删除连接文件中的后续标头吗?

谢谢!

例子:

FirstName, LastName, Phone, Zip
(data)
(data)
(data)
FirstName, LastName, Phone, Zip
(data)
(data)
(data)

【问题讨论】:

    标签: unix awk sed cat gawk


    【解决方案1】:

    我会这样做:

    sed '1h;2,$G;s/^\(.*\)\n\1$//;/./P;d' filename
    

    【讨论】:

    • @potong:我在发布之前尝试过这种方法,但无法让它发挥作用——然后我看到了你的评论,再次尝试,避免了我注意到的几个陷阱 决定反对这种方法之后,现在它可以工作了!更简单,一个字符更短,很好的捕捉。
    【解决方案2】:

    你可以这样做:

    cp file1 result
    tail -q -n +2 file2 file3 file4 >> result
    

    也就是说,从 file1 的全部内容开始,然后从其他文件的第 2 行开始追加。这样您就无需尝试查找额外的标头并在以后删除它们。

    如果您愿意,下面是相同的另一种表述:

    head -1 file1 > result
    tail -q -n +2 file1 file2 file3 file4 >> result
    

    【讨论】:

    • 这很好用,虽然我忘了提到我有 67 个文件需要连接,如果使用它对我来说会很乏味。顺便说一句,谢谢。
    • 如果您发现答案有用且有趣,您可以投票。 :)
    【解决方案3】:

    试试这个:

    sed -e '2,$s/FirstName, LastName, Phone, Zip//g' -e '/^$/d' Yourfile.txt
    

    您可以将“FirstName, LastName, Phone, Zip”替换为您拥有的任何标题。从第 2 行到文件末尾,它将用 删除标题模式,然后用 /^$/d' 删除空白行

    【讨论】:

    • 删除标题有效,尽管它没有删除空格。顺便说一句,谢谢。
    【解决方案4】:

    这是一个awk 版本。它将跳过所有带有FirstName 的行,但1 行除外

    awk 'NR>1 && /^FirstName/ {next}1' file
    FirstName, LastName, Phone, Zip
    (data)
    (data)
    (data)
    (data)
    (data)
    (data)
    

    如果标题行发生变化,我们需要遵循一个模式。

    【讨论】:

      【解决方案5】:

      方法

      awk '!a[$0];NR==1{a[$0]++}' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多