【问题标题】:Using linux command "sort -f | uniq -i" together for ignoring case一起使用linux命令“sort -f | uniq -i”来忽略大小写
【发布时间】:2013-02-08 17:45:19
【问题描述】:

我正在尝试在包含两列的数据列表中查找唯一且重复的数据。我真的只是想比较第1列中的数据。

数据可能如下所示(由选项卡分隔):

What are you doing?     Che cosa stai facendo?
WHAT ARE YOU DOING?     Che diavolo stai facendo?
what are you doing?     Qual è il tuo problema amico?

所以我一直在玩以下:

  1. 在不忽略大小写的情况下进行排序(只是“排序”,没有 -f 选项)可以减少重复项

    gawk '{ FS = "\t" ;打印 $1 }' EN-IT_Corpus.txt | 排序 | uniq -i -D > 骗子

  2. 忽略大小写进行排序 ("sort -f") 给了我更多的重复项

    gawk '{ FS = "\t" ;打印 $1 }' EN-IT_Corpus.txt | 排序-f | uniq -i -D > 骗子

如果我想查找忽略大小写的重复项,我是否认为 #2 更准确,因为它首先忽略大小写对其进行排序,然后根据排序数据查找重复项?

据我所知,我无法组合排序和唯一命令,因为排序没有显示重复项的选项。

谢谢, 史蒂夫

【问题讨论】:

  • 您希望从样本数据中得到什么输出?

标签: linux sorting awk gawk uniq


【解决方案1】:

你可以保持简单:

sort -uf
#where sort -u = the unique findings
#      sort -f = insensitive case

【讨论】:

  • 我很惊讶在 5 年内没有人想到这一点;)
【解决方案2】:

我认为关键是对数据进行预处理:

file="EN-IT_Corpus.txt"
dups="dupes.$$"
sed 's/        .*//' $file | sort -f | uniq -i -D > $dups
fgrep -i -f $dups $file

sed 命令只生成英文单词;这些是不区分大小写的,然后不区分大小写地运行uniq,只打印重复的条目。然后再次处理数据文件,使用fgrepgrep -F 查找那些重复的键,指定要在文件-f $dups 中查找的模式。显然(我希望)sed 命令中的大空白是一个制表符;你可以写\t 取决于你的shell 和sed 等等。

事实上,使用 GNU grep,你可以这样做:

sed 's/        .*//' $file |
sort -f |
uniq -i -D |
fgrep -i -f - $file

如果重复的数量真的很大,你可以用以下方法压缩它们:

sed 's/        .*//' $file |
sort -f |
uniq -i -D |
sort -f -u |
fgrep -i -f - $file

给定输入数据:

What a surprise?        Vous etes surpris?
What are you doing?        Che cosa stai facendo?
WHAT ARE YOU DOING?        Che diavolo stai facendo?
Provacation         Provacatore
what are you doing?        Qual è il tuo problema amico?
Ambiguous        Ambiguere

所有这些的输出是:

What are you doing?        Che cosa stai facendo?
WHAT ARE YOU DOING?        Che diavolo stai facendo?
what are you doing?        Qual è il tuo problema amico?

【讨论】:

    【解决方案3】:

    或者这个:

    独特:

    awk '!arr[tolower($1)]++'  inputfile > unique.txt
    

    重复

    awk '{arr[tolower($1)]++; next} 
    END{for (i in arr {if(arr[i]>1){print i, "count:", arr[i]}} }' inputfile > dup.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多