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

uniqorを使おうとしましawkたが、今迷っています。何か提案はありますか?

4

3 に答える 3

3

を使用した片道awk

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

「シングルトン」と呼ばれるファイルの内容:

1789:ST65:173  77 * ggfegZPPXX]][][_cbbcaefecbVcbb]aY^BBBBBBBBBBBBBBBB
于 2012-11-14T14:02:58.873 に答える
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すべての重複行を印刷する

-wN 文字以内で比較する


注: 列が整列されておらず、最初の列の最長文字列と最短文字列の差が 1 より大きい場合、これには問題があります (列 1 と 2 の間に 2 つのスペースがある場合)。

簡単な解決策はcolumn -t、列を整列させるために使用することです:

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

最長の文字列の長さまで増やすこと-w 13を忘れないでください。-w LL

于 2012-11-14T13:40:46.483 に答える
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 に答える