0

我的 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但我现在迷路了。你有什么建议吗?

4

3 回答 3

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

于 2012-11-14T13:40:46.483 回答
3

一种使用方式awk

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

名为“pairs”的文件的内容:

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

名为“单例”的文件的内容:

1789:ST65:173  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB
于 2012-11-14T14:02:58.873 回答
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
于 2012-11-14T16:25:44.607 回答