【问题标题】:bash - find the differed string in column of filebash - 在文件列中查找不同的字符串
【发布时间】:2017-05-07 21:18:23
【问题描述】:

我有一个文件 input.txt,在 bash 中使用 sed、awk 或 shell 脚本,我怎样才能得到一个列中唯一不同的字符串?

例如:

# cat input.txt
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1axxxxx  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fayyyyyy1c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz
878933fa4965c31c88ee8696a1a5838f  abc xyz

我只想选择并显示“878933fa4965c31c88ee8696a1axxxxx”和“878933fayyyyyy1c88ee8696a1a5838f”

【问题讨论】:

  • 澄清为什么这将是预期的输出,特别说明为什么878933fa4965c31c88ee8696a1a5838f不包含在输出中。
  • 它是一个文件的 md5sum 编码。如果一个或两个文件代码与总计 15 个左右不同,我想选择一个文件的 md5sum。或者找出不同步的文件。
  • 谢谢大家的回复。

标签: bash shell awk sed


【解决方案1】:

在纯 Bash 中:

declare -A lines
while read col1 line ; do lines["$col1"]="$col1 $line" ; done < input.txt
for i in ${!lines[@]} ; do echo "$i" ; done

首先,我们将 lines 变量声明为关联数组。然后我们在一个while循环中读取它们。然后为每个键(第一列)列出行。

【讨论】:

    【解决方案2】:

    您的问题有点含糊,但也许您正在尝试打印仅出现一次的 $1 值,如果是这样,则可以这样做:

    $ awk '{cnt[$1]++} END{for (i in cnt) if (cnt[i]==1) print i}' file
    878933fayyyyyy1c88ee8696a1a5838f
    878933fa4965c31c88ee8696a1axxxxx
    

    【讨论】:

      【解决方案3】:
      awk '{print $1}' <file> |uniq -u
      awk '{print $4}' <file> |uniq -u
      

      【讨论】:

        【解决方案4】:

        uniq -c 会给你一个计数,所以如果你的意思是只有一个条目的条目,你可以这样做:

        cut -d " " -f 1 file | sort | uniq -c | awk '$1==1{print $2}'
        

        或在perl

        perl -lane '$seen{$F[0]}++; END{for (%seen){ print if  $seen{$_}==1}}' file
        

        【讨论】:

          【解决方案5】:

          试试这个:

          cat input.txt | uniq -u | awk '{print $1}'
          

          【讨论】:

          • 欢迎来到 Stack Overflow!虽然欢迎使用此代码 sn-p,并且可能会提供一些帮助,但它会是 greatly improved if it included an explanation如何 它解决了这个问题。没有它,你的答案就没有多大的教育价值了——记住你是在为将来的读者回答这个问题,而不仅仅是现在问的人!请edit您的答案添加解释,并说明适用的限制和假设。特别是,您是否需要使用cat 而不是直接从文件中读取uniq
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-31
          • 1970-01-01
          相关资源
          最近更新 更多