我的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
我尝试使用uniq
或awk
但我现在迷路了。你有什么建议吗?
答案 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