この入力ファイルには4つの列があります。重複したアイテムを削除する必要がありますが、問題があります。優先順位はC2> C3> C4です。したがって、出力には1つの行、つまりa
それぞれe
1と1の行があります。h
g
すべて一つC1
にa
統合されました。その後、二人はek
一つにまとめられた。そしてそれは別です。ef
em
h
g
C1 C2 C3 C4
t a b c
t a b d
t a e
t e k
t a i
t e f
t e m
t h
t g
Output:
t a b c
t e k
t h
t g
次のコマンドを試しました。
awk '!seen[$2]++' ac.txt
私の問題:C2 C3とC4の間に多くの列があります。試してみましたが、
awk -F$'\t' '{ print $13 " " $18 " " $1 }' originalFile | awk '!seen[$2]++'
これらの列が削除された重複行のみが提供されます。ファイル全体(すべての列)の重複を削除したいと思います。また、別の制限があります。ファイルサイズは最大200GBまで可能です。したがって、列を削除するのは十分なアプローチではないようです。
私はLinuxを使用しています。
答え1
これは「0」列を空の列として扱いますが、より簡単なアイデアを提供します。
awk 'A[$c2] + B[$c3] + C[$c4]==0;
c2{A[$c2]++; next} c3{B[$c3]++;next} c4 {C[$c4]++}
' c2=2 c3=3 c4=4 input
(c2、c3、c4を関心のある実際の列番号に設定)
これをあなたのケースに拡張するには、次のものが利用可能である必要があります。
awk 'A[$c2] + B[$c3] + C[$c4]==0;
match($c2,"[^ ]"){A[$c2]++; next}
match($c3,"[^ ]"){B[$c3]++;next}
match($c4,"[^ ]"){C[$c4]++}
' FS=\\t c2=2 c3=3 c4=4 input
答え2
これはどうですか?(ファイルに保存して実行)
#!/usr/bin/gawk -f
BEGIN {
FS="\t"
OFS="\t"
}
FNR==1 {
next
}
($2 ~ /.+/ && a[$2]++) {
next
}
($3 ~ /.+/ && a[$3]++) {
next
}
($4 ~ /.+/ && a[$4]++) {
next
}
{
print $0
}