重複した行を削除するように指示しますが、.txt ファイルにいくつかの変更があります。

重複した行を削除するように指示しますが、.txt ファイルにいくつかの変更があります。

.txtファイルのデータセットから重複行を削除するにはどうすればよいですか?問題は、私の行の半分が重複していて、最初のRESULT行だけが必要であることです。コマンドを試しましたが、正常に動作しませんでした。

sort myfile.txt uniq -u | newfile.txt

これは私のファイルの内容です。私のファイルの行数は299873です。

ligand_06278/out.pdbqt:REMARK  Name = 22626427
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.3      2.094      2.612
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.3      2.821      8.000
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.4      3.333      6.628
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.4      4.526      7.557
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.5      2.500      4.835
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.5      2.516      7.135
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.6      2.660      7.148
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.8      3.141      6.023
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.9      0.000      0.000
ligand_06279/out.pdbqt:REMARK  Name = 22629712
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.1      9.841     13.115
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.3     15.483     18.543
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.3      1.944      5.962
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.3      8.946     12.260
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.5     14.453     17.240
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.8     10.330     14.145
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.8      1.727      5.848
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -7.1      7.429     11.509
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -7.3      0.000      0.000
ligand_06280/out.pdbqt:REMARK  Name = 22631372
ligand_06280/out.pdbqt:REMARK VINA RESULT:     -10.0      3.811      7.264
ligand_06280/out.pdbqt:REMARK VINA RESULT:     -10.1      0.000      0.000
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.3      5.006      9.020
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.4      2.195      8.687
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.4      2.712      9.301
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.6      2.186      8.354
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.7      5.168      7.981
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.8      1.961      2.580
ligand_06280/out.pdbqt:REMARK VINA RESULT:      -9.8      2.311      8.341

ベストアンサー1

$ awk -F: '$1 != p && /RESULT/ { print; p = $1 }' file
ligand_06278/out.pdbqt:REMARK VINA RESULT:      -8.3      2.094      2.612
ligand_06279/out.pdbqt:REMARK VINA RESULT:      -6.1      9.841     13.115
ligand_06280/out.pdbqt:REMARK VINA RESULT:     -10.0      3.811      7.264

RESULTこれにより、入力ファイルに記載されている各ファイルの最初の行が出力されます。最初の列(ファイル名)を前の行の最初の列と比較し、現在の行に単語が含まれているかどうかをテストしてこれを行いますRESULT。前の行とファイル名が異なる行が見つかると、その行は更新された値RESULTでそのまま印刷されます。p


入力ファイルがgrep複数のファイルを実行した結果(おそらくgrep search)と非常によく似ていることがわかりましたREMARK

すべてのファイルを検索し、各ファイルに一致する最初の行を取得するには、次の手順を実行しますREMARK VINA RESULT

find . -type f -path './ligand_*' -name 'out.pdbqt' -exec sed -n '/REMARK VINA RESULT/{p;q;}' {} ';'

または簡単なループで:

for name in ligand_*/out.pdbqt; do
    grep -F 'REMARK VINA RESULT' "$name" | head -n 1
done

ここではさまざまな方法を使用しましたが、最も自然に感じる方法を選択してください。

おすすめ記事