【问题标题】:How I can remove double lines in whole file, omiting first n characters in each line?如何删除整个文件中的双行,省略每行中的前 n 个字符?
【发布时间】:2014-03-27 22:25:10
【问题描述】:

我有以下数据格式:

123456786|data1
123456787|data2
123456788|data3

第一列是 main_id。我需要从 txt 文件中删除所有重复的行,但省略 main_id 编号。我该怎么做?

通常我使用这样的 AWK 脚本,但它会找到双行而不省略:

awk '!x[$0]++' $2 > "$filename"_no_doublets.txt #remove doublets

感谢您的帮助。

【问题讨论】:

    标签: bash awk text-processing


    【解决方案1】:

    你可以使用:

    awk -F'|' '!x[$2]++' 
    

    这将仅根据|分隔的字段2查找重复项

    更新:

    awk '{line=$0; sub(/^[^|]+\|/, "", line)} !found[line]++'
    

    【讨论】:

    • 谢谢。如果我在 main_id 列之后有几列,并且我想逐行查找重复的比较而没有 main_id 第一列怎么办?
    • @Kent:Thakks,是的,伟大的思想家也喜欢 :) +1 你也回答了。
    • 现在 Ed 也想到了同样的思路来验证我们的思维过程:)
    • 是的,我只是迟到了。我会删除我的,但我认为对变量名使用有意义的词可能会很有用,而且我对在 sub() 中使用的 RE 有一点偏好。
    • 感谢@EdMorton,我按照建议更新了有意义的变量名。
    【解决方案2】:
    awk '{key=$0; sub(/[^|]+/,"",key)} !seen[key]++' file
    

    【讨论】:

      【解决方案3】:

      如果你有更多的列,这一行应该这样做:

      awk '{a=$0;sub(/[^|]*\|/,"",a)}!x[a]++' file
      

      示例:

      123456786|data1
      12345676|data1
      123456787|data2|foo
      203948787|data2|foo
      123456788|data3
      
      kent$  awk '{a=$0;sub(/[^|]*\|/,"",a)}!x[a]++' f
      123456786|data1
      123456787|data2|foo
      123456788|data3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 2022-10-01
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-01-09
        • 2019-05-31
        相关资源
        最近更新 更多