根据文件中出现的次数对条目进行排序

时间:2012-11-14 13:36:36

标签: linux file-io awk

我的tab-del文件中的一些条目是单例,有些是配对的,我想根据使用某些Unix命令行的出现次数来分割我的文件。

这是一个例子

1789:ST65:17  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB
1789:ST65:17  141 * ggbggggagedde^degdggaedebda`aedaaedcecdaa\bdSW\_T
1789:ST65:99  77 * ffcddcMdcdeebeeXecce_``]Pcfd]`aZ_bbK\`aUZZYP]`bb^b
1789:ST65:99  141 * gggggggegggfegggggg`ggeegebgfgeaggeedfeM^`K^`BBBBB
1789:ST65:173  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB
1789:ST65:201  77 * eacegZPPXX]][][_cbbcaef121cacc]aY^BBBBBBBBBBBBBBBB
1789:ST65:201  141 * ggbggggeeacaaadggaedebda`aedaaedcecdaa\bdSW\_T

在这个简单的例子中,我希望有一个包含

的第一个文件配对条目
1789:ST65:17  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB
1789:ST65:17  141 * ggbggggagedde^degdggaedebda`aedaaedcecdaa\bdSW\_T
1789:ST65:99  77 * ffcddcMdcdeebeeXecce_``]Pcfd]`aZ_bbK\`aUZZYP]`bb^b
1789:ST65:99  141 * gggggggegggfegggggg`ggeegebgfgeaggeedfeM^`K^`BBB.
1789:ST65:201  77 * eacegZPPXX]][][_cbbcaef121cacc]aY^BBBBBBBBBBBBBBBB
1789:ST65:201  141 * ggbggggeeacaaadggaedebda`aedaaedcecdaa\bdSW\_T

和另一个只包含单例的文件:

1789:ST65:173  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB

我尝试使用uniqawk但我现在迷路了。你有什么建议吗?

3 个答案:

答案 0 :(得分:3)

使用uniq执行此操作:

# Duplicates 
$ uniq -D -w 13 file.txt > duplicates.txt

1789:ST65:17  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB
1789:ST65:17  141 * ggbggggagedde^degdggaedebda`aedaaedcecdaa\bdSW\_T
1789:ST65:99  77 * ffcddcMdcdeebeeXecce_``]Pcfd]`aZ_bbK\`aUZZYP]`bb^b
1789:ST65:99  141 * gggggggegggfegggggg`ggeegebgfgeaggeedfeM^`K^`BBBBB
1789:ST65:201  77 * eacegZPPXX]][][_cbbcaef121cacc]aY^BBBBBBBBBBBBBBBB
1789:ST65:201  141 * ggbggggeeacaaadggaedebda`aedaaedcecdaa\bdSW\_T 

# Singletons 
$ uniq -u -w 13 file.txt > singletons.txt

1789:ST65:173  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB

选项:

-u打印所有唯一的行

-D打印所有重复的行

-w比较不超过N个字符


注意:如果列没有对齐,并且第一列中最长和最短的字符串之间的差异大于1(假设第一列和第二列之间有两个空格),则存在缺陷。

一个简单的解决方案是使用column -t来对齐列:

column -t file.txt | uniq -u -w 13 > singletons.txt

请记住将-w 13增加到-w L,其中L是最长字符串的长度。

答案 1 :(得分:3)

使用awk的一种方式:

awk 'FNR==NR { array[$1]++; next } { print > (array[$1]==2 ? "pairs" : "singletons") }' file.txt file.txt

名为'pair'的文件内容:

1789:ST65:17  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB
1789:ST65:17  141 * ggbggggagedde^degdggaedebda`aedaaedcecdaa\bdSW\_T
1789:ST65:99  77 * ffcddcMdcdeebeeXecce_``]Pcfd]`aZ_bbK\`aUZZYP]`bb^b
1789:ST65:99  141 * gggggggegggfegggggg`ggeegebgfgeaggeedfeM^`K^`BBBBB
1789:ST65:201  77 * eacegZPPXX]][][_cbbcaef121cacc]aY^BBBBBBBBBBBBBBBB
1789:ST65:201  141 * ggbggggeeacaaadggaedebda`aedaaedcecdaa\bdSW\_T

名为'singletons'的文件内容:

1789:ST65:173  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB

答案 2 :(得分:1)

使用awk的一次性方法:

awk '
!seen[$1]++ {
   solo[$1] = $0 ORS
   next
}
{
   print solo[$1] $0 > "pairs"
   delete solo[$1]
}
END {
   for (key in solo) {
      printf "%s", solo[key] > "singletons"
   }
}
' file