次のようにinput.txtファイルがあります。商標区切り形式:
aaaa bbbb
aaaa bbbb c
aaaa bbbb c dd
aaaa bbbb cc
aaaa bbbb x
aaaa bbbb xx
dddd eeee
dddd eeee f
dddd eeee f g
dddd eeee fe
h ii j
各行について、他の行にすでに先行列が含まれていることを確認してください。その場合は、その行を削除してください。それ以外の場合は、この例を見てみましょう。
- 最初の列が同じ追加列を含む別の行(2行)があるため、最初の行は削除されます。その場合は、最初の行を削除して2番目の行を維持してください。
- 同じ最初の列を持つ追加の列を含む別の行(3行目)があるため、2行目は削除されます。この場合は、2行目を削除して3行目を維持してください。
- 同じ最初の列を持つ他の行がないため、3番目の行は削除されません。この場合、3行目を保持します。
その他などの出力ファイルは次のようになります。
aaaa bbbb c dd
aaaa bbbb cc
aaaa bbbb x
aaaa bbbb xx
dddd eeee f g
dddd eeee fe
h ii j
何百万もの行をシームレスに実行できるソリューションを見つけることもできます。
ベストアンサー1
これは入力を逆順に並べ替えるので、「foobar」が「foo」の前に来ます。これは、現在の行が各行の最初の文字で始まる前の行のサブストリングである場合には発生しません。現在を印刷します。ライン(foo)。
$ sort -r file | awk 'index(prev FS,$0 FS) != 1; {prev=$0}'
h ii j
dddd eeee fe
dddd eeee f g
aaaa bbbb xx
aaaa bbbb x
aaaa bbbb cc
aaaa bbbb c dd
出力順序が重要な場合は、この問題を解決する方法がいくつかあります。たとえば、次のようになります。
$ cat -n file | sort -k2r |
awk '{orig=$0; $1=""} index(prev FS,$0 FS) != 1{print orig} {prev=$0}' |
sort -n | cut -f2-
aaaa bbbb c dd
aaaa bbbb cc
aaaa bbbb x
aaaa bbbb xx
dddd eeee f g
dddd eeee fe
h ii j